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.
Č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:
- 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).
- 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.
- 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_nameclassSon(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 = hobbydefget_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:
- 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.
- 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.
- 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úť.
- 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.
- Vyhnite sa kruhovým závislostiam v hierarchii triedy, ktoré môžu viesť k nepredvídateľnému správaniu.
- 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.