Dedičnosť je užitočná, ale jej plný potenciál môžete odomknúť opätovným použitím kódu zo základných tried.

Kľúčové informácie

  • Funkcia super() Pythonu vám umožňuje volať metódy nadtriedy z podtriedy, čo uľahčuje implementáciu dedenia a prepisovania metód.
  • Funkcia super() úzko súvisí s Method Resolution Order (MRO) v Pythone, ktorý určuje poradie, v ktorom sa v triedach predkov hľadajú metódy alebo atribúty.
  • Používanie super() v konštruktoroch triedy je bežnou praxou na inicializáciu bežných atribútov v rodičovskej triede a špecifickejších atribútov v podradenej triede. Nepoužitie super() môže viesť k nezamýšľaným následkom, ako je napríklad chýbajúca inicializácia atribútov.

Jednou zo základných vlastností Pythonu je jeho OOP paradigma, ktorú môžete použiť na modelovanie entít reálneho sveta a ich vzťahov.

Pri práci s triedami Python budete často používať dedičnosť a prepísať atribúty alebo metódy nadtriedy. Python poskytuje a Super() funkcia, ktorá vám umožňuje volať metódy nadtriedy z podtriedy.

instagram viewer

Čo je super() a prečo ho potrebujete?

Pomocou dedičnosti môžete vytvoriť novú triedu Pythonu, ktorá zdedí vlastnosti existujúcej triedy. Môžete tiež prepísať metódy nadtriedy v podtriede, čím získate alternatívne implementácie. Možno však budete chcieť použiť novú funkciu ako doplnok k starej, a nie namiesto nej. V tomto prípade, Super() je užitočné.

Môžete použiť Super() funkcia na prístup k atribútom nadtriedy a vyvolanie metód nadtriedy. Super je nevyhnutné pre objektovo orientované programovanie pretože to uľahčuje implementáciu dedenia a prepisovania metód.

Ako funguje super()?

interne, Super() úzko súvisí s Poradie rozlíšenia metódy (MRO) v Pythone, ktorý určuje lineárny algoritmus C3.

Tu je návod Super() Tvorba:

  1. Určite aktuálnu triedu a inštanciu: Keď zavoláte Super() v rámci metódy podtriedy Python automaticky zistí aktuálnu triedu (triedu obsahujúcu metódu, ktorá volala Super()) a inštancia tejto triedy (t. j. seba).
  2. Určite nadtriedu: Super() berie dva argumenty – aktuálnu triedu a inštanciu – ktoré nemusíte explicitne odovzdávať. Tieto informácie používa na určenie nadtriedy na delegovanie volania metódy. Robí to tak, že skúma hierarchiu tried a MRO.
  3. Vyvolajte metódu nadtriedy: Keď je určená supertrieda, Super() umožňuje volať jeho metódy, ako keby ste ich volali priamo z podtriedy. To vám umožňuje rozšíriť alebo prepísať metódy, pričom stále používate pôvodnú implementáciu z nadtriedy.

Použitie super() v konštruktore triedy

Použitím Super() v konštruktore triedy je bežnou praxou, pretože často budete chcieť inicializovať bežné atribúty v rodičovskej triede a špecifickejšie atribúty v potomkovi.

Aby sme to demonštrovali, definujte triedu Pythonu, otec, ktorý a Syn trieda dedí po:

classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name

classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
# Call the parent class constructor (Father)
super().__init__(first_name, last_name)

self.age = age
self.hobby = hobby

defget_info(self):
returnf"Son's Name: {self.first_name}{self.last_name}, \
Son's Age: {self.age}, Son's Hobby: {self.hobby}"

# Create an instance of the Son class
son = Son("Pius", "Effiong", 25, "Playing Guitar")

# Access attributes
print(son.get_info())

Vnútri Syn konštruktor, výzva na super().init() dovoláva sa otec konštruktor triedy, ktorý ju odovzdá krstné meno a priezvisko ako parametre. Tým sa zabezpečí, že otec trieda môže stále správne nastaviť atribúty názvu, dokonca aj na a Syn objekt.

Ak nezavoláte Super() v konštruktore triedy sa nespustí konštruktor jeho nadradenej triedy. To môže viesť k neúmyselným dôsledkom, ako sú chýbajúce inicializácie atribútov alebo neúplné nastavenie stavu nadradenej triedy:

...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...

Ak sa teraz pokúsite zavolať na dostať informácie spôsob, zvýši to an AttributeError pretože seba.krstne_meno a self.priezvisko atribúty neboli inicializované.

Použitie super() v triednych metódach

Môžeš použiť Super() v iných metódach, okrem konštruktérov, rovnakým spôsobom. To vám umožní rozšíriť alebo prepísať správanie metódy nadtriedy.

classFather:
defspeak(self):
return"Hello from Father"

classSon(Father):
defspeak(self):
# Call the parent class's speak method using super()
parent_greeting = super().speak()
returnf"Hello from Son\n{parent_greeting}"

# Create an instance of the Son class
son = Son()

# Call the speak method of the Son class
son_greeting = son.speak()

print(son_greeting)

The Syn trieda dedí z otec a má svoje hovoriť metóda. The hovoriť metóda Syn trieda používa super().hovor() zavolať na hovoriť metóda otec trieda. To mu umožňuje zahrnúť správu z rodičovskej triedy a zároveň ju rozšíriť o správu špecifickú pre podradenú triedu.

Nepoužívanie Super() v metóde, ktorá prepíše inú, znamená, že funkcia prítomná v metóde nadradenej triedy sa neprejaví. Výsledkom je úplné nahradenie správania metódy, čo môže viesť k správaniu, ktoré ste nezamýšľali.

Pochopenie poradia rozlíšenia metódy

Method Resolution Order (MRO) je poradie, v ktorom Python vyhľadáva triedy predkov, keď pristupujete k metóde alebo atribútu. MRO pomáha Pythonu určiť, ktorá metóda sa má volať, keď existuje viacero hierarchií dedičnosti.

classNigeria():
defculture(self):
print("Nigeria's culture")

classAfrica():
defculture(self):
print("Africa's culture")

Tu je to, čo sa stane, keď vytvoríte inštanciu súboru Lagos triedy a zavolajte na kultúra metóda:

  1. Python začína hľadaním kultúra metóda v Lagos trieda samotná. Ak ju nájde, zavolá metódu. Ak nie, prejde na druhý krok.
  2. Ak nenájde kultúra metóda v Lagos triedy, Python sa pozerá na základné triedy v poradí, v akom sa objavujú v definícii triedy. V tomto prípade, Lagos dedí najskôr po Afriky a potom od Nigéria. Takže Python bude hľadať kultúra metóda v Afriky najprv.
  3. Ak nenájde kultúra metóda v Afriky triedy, Python sa potom pozrie do Nigéria trieda. Toto správanie pokračuje, kým nedosiahne koniec hierarchie a vyvolá chybu, ak nemôže nájsť metódu v žiadnej z nadtried.

Výstup zobrazuje poradie rozlíšenia metódy Lagos, začínajúc zľava doprava.

Bežné úskalia a osvedčené postupy

Pri práci s Super(), existuje niekoľko bežných úskalí, ktorým sa treba vyhnúť.

  1. Dávajte pozor na poradie riešenia metód, najmä v scenároch viacerých dedičstiev. Ak potrebujete použiť komplexnú viacnásobnú dedičnosť, mali by ste byť oboznámení s C3 Linearizačný algoritmus ktoré Python používa na určenie MRO.
  2. Vyhnite sa kruhovým závislostiam v hierarchii triedy, ktoré môžu viesť k nepredvídateľnému správaniu.
  3. Jasne zdokumentujte svoj kód, najmä pri používaní Super() v zložitých hierarchiách tried, aby to bolo zrozumiteľnejšie pre ostatných vývojárov.

Použite super() správnym spôsobom

Pythonov Super() funkcia je výkonná funkcia, keď pracujete s dedičnosťou a prepisovaním metód. Pochopenie ako Super() funguje a dodržiavanie osvedčených postupov vám umožní vytvoriť viac udržiavateľný a efektívnejší kód vo vašich projektoch Python.