HALLOWEEN JE TADY: Získej 66 % extra kreditů zdarma při nákupu od 1199 kreditů s promo kódem NEBOJSEIT66. Zjisti více:
NOVINKA: Začni v IT jako webmaster s komplexním akreditovaným online kurzem Tvůrce WWW stránek. Zjisti více:

Diskuze – Lekce 3 - Atributy a metody v Pythonu

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Barbora Zdvihalová:12. června 10:45

"Za úkol máte předělat si naši konzolovou kalkulačku do
objektů."
Opravdu by tvůrcům dalo práci, kdyby tak nějak navedli, co přesně z kalkulačky se má "předělat"? Skoro mi přijde, že víc než jen "Vítejte v kalkulačce" a "Děkuji za použití kalkulačky" po této lekci neumíme :) (a pokud to tak je, proč to není blíže specifikované?) Chápu, že samostatná práce je potřeba, ale tohle je placený kurz, kde bych očekávala větší leadership :)

 
Odpovědět
12. června 10:45
Avatar
DarkCoder
Člen
Avatar
DarkCoder:12. června 13:58

Zdejší výklad je dosti zjednodušený. Zaměřený na základní mechaniku volání metod s parametry, ale nevysvětluje proč a jak objekty v OOP spolupracují.

Myslíte, že chtít po studujících předělat kalkulačku s dosavadními podklady které jste jim dodali, je vhodné?

Skutečné OOP je hlavně o vzájemné komunikaci instancí s jejich vlastními daty a chováním. Zde je ukázkový příklad:

class Pozdravovac:
    def __init__(self, styl):
        self.styl = styl  # textový styl pozdravu, např. "formalni" nebo "neformalni"

    def pozdrav(self, kdo_pozdravuje, koho_pozdravuje):
        # Sestaví pozdrav podle stylu a jmen uživatelů
        if self.styl == "formalni":
            return f"Dobrý den, {koho_pozdravuje.jmeno}. Já jsem {kdo_pozdravuje.jmeno}."
        elif self.styl == "neformalni":
            return f"Ahoj {koho_pozdravuje.jmeno}! Jsem {kdo_pozdravuje.jmeno}."
        else:
            return f"{kdo_pozdravuje.jmeno} zdraví {koho_pozdravuje.jmeno}."

class Uzivatel:
    def __init__(self, jmeno, pozdravovac):
        self.jmeno = jmeno  # jméno uživatele
        self.pozdravovac = pozdravovac  # instance Pozdravovac definující styl pozdravu

    def pozdrav(self, jiny_uzivatel):
        # Pozdraví jiného uživatele podle svého stylu (pozdravovače)
        return self.pozdravovac.pozdrav(self, jiny_uzivatel)

# Vytvoření dvou různých pozdravovačů (instance Pozdravovac)
formalni = Pozdravovac("formalni")
neformalni = Pozdravovac("neformalni")

# Vytvoření uživatelů s různými styly pozdravu
karel = Uzivatel("Karel", formalni)
honza = Uzivatel("Honza", neformalni)

print(karel.pozdrav(honza))  # Dobrý den, Honza. Já jsem Karel.
print(honza.pozdrav(karel))  # Ahoj Karel! Jsem Honza.
Odpovědět
12. června 13:58
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Jan Valenta
Člen
Avatar
Odpovídá na DarkCoder
Jan Valenta:23. června 16:39

Děkuju!

 
Odpovědět
23. června 16:39
Avatar
Branislav Kollar:1. července 10:10

Po niekoľkých lekciách OOP máme prerobiť kalkulačku na OOP? To nemôžete myslieť vážne. :)

 
Odpovědět
1. července 10:10
Avatar
Pavel Baru
Člen
Avatar
Pavel Baru:15. července 7:55

Konec velmi pobavil. :-D

 
Odpovědět
15. července 7:55
Avatar
Katarína Bodzsár Brudňáková:16. září 13:36

pre začiatočníka je to trošku viac nezrozumiteľné.

 
Odpovědět
16. září 13:36
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Katarína Bodzsár Brudňáková
David Hartinger:16. září 18:17

Ahoj, prosím, co konkrétně je podle tebe nesrozumitelné?

Odpovědět
16. září 18:17
New kid back on the block with a R.I.P
Avatar
Barbora Zdvihalová:29. září 7:02
class Zdravic:
    text = "Ahoj"
    def pozdrav(self, jmeno):
        return f"{self.text} {jmeno}"

zdravic = Zdravic()
zdravic.text = "Ahoj uživateli"
print(zdravic.pozdrav("Karel"))
print(zdravic.pozdrav("Petr"))
zdravic.text = "Vítám tě tu programátore"
print(zdravic.pozdrav("Richard"))

Muzu se zeptat, proc v f stringu neni {self.jmeno}?

@DarkCoder dekuji za vysvetlovani. :)

 
Odpovědět
29. září 7:02
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Barbora Zdvihalová
DarkCoder:29. září 8:18

Důvod, proč před jmeno není self je ten, že jmeno není atribut třídy ale lokální proměnná (parametr).

class Zdravic:
    text = "Ahoj"

    def pozdrav(self, jmeno):
        return f"{self.text} {jmeno}"

z = Zdravic()

print(z.pozdrav("Barbora"))    # Ahoj Barbora

jmeno je dočasná hodnota, kterou metoda dostane při volání.
Nepoužíváš self.jmeno, protože jmeno nepatří objektu – není to jeho atribut.
self.text je přístup k atributu text, který existuje na třídě nebo instanci.

Pomocí self přistupuješ k atributům patřící objektu a ty musí být předem nastaveny, např. v konstruktoru __init__.

class Zdravic:
    def __init__(self, jmeno):
        self.text = "Ahoj"
        self.jmeno = jmeno

    def pozdrav(self):
        return f"{self.text} {self.jmeno}"

# Vytváříme samostatné instance pro každé jméno
z1 = Zdravic("Barbora")

print(z1.pozdrav())  # Ahoj Barbora

jmeno je přiřazeno do self.jmeno v konstruktoru __init__ – to znamená, že je to atribut objektu.
Díky tomu ho můžeš později použít v jiné metodě (pozdrav) bez předávání znovu.
Tento objekt si "pamatuje", koho zdraví.

Odpovědět
29. září 8:18
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Barbora Zdvihalová
DarkCoder:29. září 8:48

Zde je ukázka všeho v jednom s vysvětlením:

class Zdravic:
    # jazyk je Třídní atribut – sdílený všemi instancemi
    jazyk = "česky"

    def __init__(self, jmeno):
        # jmeno je Parametr konstruktoru __init__ – přiřazuje se instančnímu atributu
        # jmeno a text před self jsou Instanční atributy – specifické pro jednu instanci
        self.jmeno = jmeno
        self.text = "Ahoj"

    def pozdrav(self, pozdravene_jmeno):
        # pozdravene_jmeno je parametr metody – předává se při volání
        # Použití všech typů proměnných v jedné větě
        return f"{self.text} {pozdravene_jmeno}! (Zdraví {self.jmeno}, mluvím {self.jazyk})"


# Vytvoření instance s instančním atributem jmeno = "Karel"
z = Zdravic("Karel")

# Volání metody, kde jako parametr zadáváš někoho, koho zdravíš
print(z.pozdrav("Barbora"))  # Ahoj Barbora! (Zdraví Karel, mluvím česky)
print(z.pozdrav("Petr"))     # Ahoj Petr! (Zdraví Karel, mluvím česky)

# Změna třídního atributu – ovlivní všechny instance, pokud nemají vlastní .jazyk
Zdravic.jazyk = "slovensky"
print(z.pozdrav("Lucie"))    # Ahoj Lucie! (Zdraví Karel, mluvím slovensky)

Rekapitulace

Třídní atribut jazyk = "česky" Sdílený všemi instancemi, uložen na třídě
Instanční atribut self.jmeno, self.text Unikátní pro každou instanci, uložen v objektu (self)
Parametr konstruktoru jmeno v def __init__(self, jmeno) Slouží k předání hodnoty při vytvoření objektu
Parametr metody pozdravene_jmeno v def pozdrav(...) Dočasný – slouží jen při volání metody

Odpovědět
29. září 8:48
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.