Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 3. diel - Atribúty a metódy v Pythone

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
Barbora Zdvihalová:12. júna 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 :)

Avatar
DarkCoder
Člen
Avatar
DarkCoder:12. júna 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.
Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Branislav Kollar:1. júla 10:10

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

Avatar
Pavel Baru
Člen
Avatar
Pavel Baru:15. júla 7:55

Konec velmi pobavil. :-D

Avatar
Katarína Bodzsár Brudňáková:16. septembra 13:36

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

Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Katarína Bodzsár Brudňáková
David Hartinger:16. septembra 18:17

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

Odpovedať
New kid back on the block with a R.I.P
Avatar
Barbora Zdvihalová:29. septembra 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. :)

Avatar
DarkCoder
Člen
Avatar
Odpovedá na Barbora Zdvihalová
DarkCoder:29. septembra 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í.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Barbora Zdvihalová
DarkCoder:29. septembra 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

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 13.