Az öröklődés hasznos, de az alaposztályok kódjának újrafelhasználásával teljes potenciálját felszabadíthatja.

Kulcs elvitelek

  • A Python super() függvénye lehetővé teszi szuperosztály metódusok meghívását egy alosztályból, megkönnyítve az öröklődés és a metódusfelülírás megvalósítását.
  • A super() függvény szorosan kapcsolódik a Python Method Resolution Order-hez (MRO), amely meghatározza, hogy az ősosztályok milyen sorrendben keressenek metódusokat vagy attribútumokat.
  • A super() használata az osztálykonstruktorokban bevett gyakorlat a szülőosztályban a közös attribútumok inicializálására, a gyermekosztályban pedig a specifikusabb attribútumok inicializálására. A super() használatának elmulasztása nem kívánt következményekhez vezethet, például hiányzó attribútum-inicializálásokhoz.

A Python egyik alapvető jellemzője az OOP paradigma, amellyel valós entitások és kapcsolataik modellezhetők.

Amikor Python osztályokkal dolgozik, gyakran használ öröklődést, és felülbírálja a szuperosztály attribútumait vagy metódusait. A Python biztosítja a

instagram viewer
szuper() függvény, amely lehetővé teszi a szuperosztály metódusainak meghívását az alosztályból.

Mi az a szuper() és miért van szüksége rá?

Az öröklődés használatával új Python-osztályt készíthet, amely örökli egy meglévő osztály jellemzőit. Az alosztály szuperosztályának metódusait is felülírhatja, alternatív megvalósításokat biztosítva. Előfordulhat azonban, hogy az új funkciót a régi mellett szeretné használni, nem pedig helyette. Ebben az esetben, szuper() hasznos.

Használhatja a szuper() függvény a szuperosztály attribútumainak eléréséhez és a szuperosztály metódusainak meghívásához. A szuper elengedhetetlen objektumorientált programozás mert megkönnyíti az öröklődés és a metódus felülbírálásának megvalósítását.

Hogyan működik a szuper()?

Belsőleg, szuper() szorosan kapcsolódik a Módszer felbontási sorrend (MRO) Pythonban, amelyet a C3 linearizációs algoritmus határoz meg.

Itt van, hogyan szuper() művek:

  1. Határozza meg az aktuális osztályt és példányt: Amikor hívsz szuper() egy alosztály metódusán belül a Python automatikusan kitalálja az aktuális osztályt (az osztályt, amely tartalmazza a meghívott metódust szuper()) és az adott osztály példánya (pl. maga).
  2. Határozza meg a szuperosztályt: szuper() két argumentumot vesz fel – az aktuális osztályt és a példányt –, amelyeket nem kell kifejezetten átadni. Ezt az információt használja fel a szuperosztály meghatározására a metódushívás delegálásához. Ezt az osztályhierarchia és az MRO vizsgálatával teszi.
  3. Hívja meg a metódust a szuperosztályon: Miután meghatározták a szuperosztályt, szuper() lehetővé teszi metódusainak meghívását, mintha közvetlenül az alosztályból hívnád őket. Ez lehetővé teszi a metódusok kiterjesztését vagy felülbírálását, miközben továbbra is használja a szuperosztály eredeti megvalósítását.

A super() használata egy osztálykonstruktorban

Használata szuper() Az osztálykonstruktorban bevett gyakorlat, mivel gyakran kell inicializálni a közös attribútumokat a szülőosztályban, és a konkrétabbakat a gyermekben.

Ennek bizonyítására definiáljon egy Python osztályt, Apa, amely a Fiú osztály innen örökli:

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())

Benne Fiú konstruktor, a felhívás szuper().init() hivatkozik a Apa osztályú konstruktőr, átadva azt keresztnév és vezetéknév mint paraméterek. Ez biztosítja, hogy a Apa osztály továbbra is helyesen tudja beállítani a névattribútumokat, még a-n is Fiú tárgy.

Ha nem hív szuper() osztálykonstruktorban a szülőosztályának konstruktora nem fut le. Ez nem kívánt következményekhez vezethet, például hiányzó attribútum-inicializálásokhoz vagy a szülőosztály állapotának nem teljes beállításához:

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

Ha most megpróbálja felhívni a szerezz információt módszerrel, akkor egy AttributeError mert a self.first_name és self.last_name az attribútumok nincsenek inicializálva.

A szuper() használata az osztálymetódusokban

Te tudod használni szuper() más módszerekben, a konstruktorokon kívül, ugyanúgy. Ez lehetővé teszi a szuperosztály metódusának kiterjesztését vagy felülbírálását.

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)

A Fiú osztály örököl a Apa és megvan a maga beszél módszer. A beszél módszere a Fiú osztályú felhasználások szuper().speak() felhívni a beszél módszere a Apa osztály. Ez lehetővé teszi, hogy tartalmazza a szülő osztály üzenetét, miközben kibővítse egy, a gyermekosztályra jellemző üzenettel.

Nem használható szuper() olyan metódusban, amely felülír egy másikat, azt jelenti, hogy a szülő osztály metódusában lévő funkcionalitás nem lép érvénybe. Ez a metódus viselkedésének teljes cseréjét eredményezi, ami olyan viselkedéshez vezethet, amelyet nem szándékozott.

A módszer feloldási sorrendjének megértése

Method Resolution Order (MRO) az a sorrend, amelyben a Python az ősosztályokat keresi, amikor hozzáfér egy metódushoz vagy attribútumhoz. Az MRO segít a Pythonnak meghatározni, hogy melyik metódust hívja meg, ha több öröklődési hierarchia létezik.

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

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

Íme, mi történik, amikor létrehoz egy példányt a Lagos osztályt, és hívja fel a kultúra módszer:

  1. A Python azzal kezdi, hogy megkeresi a kultúra módszer a Lagos maga az osztály. Ha megtalálja, meghívja a módszert. Ha nem, akkor a második lépésre lép.
  2. Ha nem találja meg a kultúra módszer a Lagos osztályban, a Python az alaposztályokat abban a sorrendben vizsgálja, ahogyan az osztálydefinícióban megjelennek. Ebben az esetben, Lagos először örököl Afrika majd onnan Nigéria. Tehát a Python meg fogja keresni a kultúra módszer be Afrika első.
  3. Ha nem találja meg a kultúra módszer a Afrika osztályban, a Python ezután megnézi a Nigéria osztály. Ez a viselkedés addig folytatódik, amíg el nem éri a hierarchia végét, és hibát jelez, ha nem találja a metódust egyik szuperosztályban sem.

A kimeneten megjelenik a Method Resolution Order of Lagos, balról jobbra indulva.

Gyakori buktatók és legjobb gyakorlatok

Amikor dolgozik szuper(), van néhány gyakori buktató, amelyet el kell kerülni.

  1. Vegye figyelembe a Method Resolution Ordert, különösen több öröklési forgatókönyv esetén. Ha összetett többszörös öröklődést kell használnia, ismernie kell a C3 Linearizációs algoritmus amelyet a Python az MRO meghatározására használ.
  2. Kerülje el a körkörös függőséget az osztályhierarchiában, ami kiszámíthatatlan viselkedéshez vezethet.
  3. Nyilvánvalóan dokumentálja a kódját, különösen használat közben szuper() összetett osztályhierarchiákban, hogy érthetőbb legyen a többi fejlesztő számára.

Használja a Super()-t a megfelelő módon

Python szuper() A funkció egy hatékony funkció, ha öröklődéssel és metódusfelülírással dolgozik. Annak megértése, hogyan szuper() működik, és a bevált gyakorlatok követésével karbantarthatóbb és hatékonyabb kódot hozhat létre Python-projektjeiben.