Наслеђивање је корисно, али можете откључати његов пуни потенцијал поновним коришћењем кода из основних класа.
Кључне Такеаваис
- Питхон-ова функција супер() вам омогућава да позовете методе суперкласе из поткласе, што олакшава имплементацију наслеђивања и замене метода.
- Функција супер() је уско повезана са редоследом решавања метода (МРО) у Питхон-у, који одређује редослед којим се класе претка траже за методе или атрибуте.
- Коришћење супер() у конструкторима класа је уобичајена пракса за иницијализацију заједничких атрибута у родитељској класи и специфичнијих у подређеној класи. Неуспех коришћења супер() може довести до нежељених последица, као што је недостатак иницијализације атрибута.
Једна од кључних карактеристика Питхон-а је његова ООП парадигма, коју можете користити за моделирање стварних ентитета и њихових односа.
Када радите са Питхон класама, често ћете користити наслеђивање и заменити атрибуте или методе суперкласе. Питхон пружа а супер() функција која вам омогућава да позовете методе суперкласе из поткласе.
Шта је супер() и зашто вам треба?
Користећи наслеђивање, можете направити нову Питхон класу која наслеђује карактеристике постојеће класе. Такође можете заменити методе суперкласе у поткласи, пружајући алтернативне имплементације. Међутим, можда бисте желели да користите нову функционалност поред старе, а не уместо ње. У овом случају, супер() је корисно.
Можете користити супер() функција за приступ атрибутима суперкласе и позивање метода суперкласе. Супер је неопходно за објектно оријентисано програмирање јер олакшава имплементацију наслеђивања и надјачавања метода.
Како супер() функционише?
интерно, супер() је уско повезан са Метод Резолуција Редослед (МРО) у Питхон-у, што одређује алгоритам Ц3 линеаризације.
Ево како супер() Извођење радова:
- Одредите тренутну класу и инстанцу: Када зовеш супер() унутар методе поткласе, Питхон аутоматски открива тренутну класу (класу која садржи метод који је позвао супер()) и инстанцу те класе (тј. селф).
- Одредите суперкласу: супер() узима два аргумента — тренутну класу и инстанцу — које не морате експлицитно да проследите. Користи ове информације да одреди суперкласу за делегирање позива методе. То ради испитивањем хијерархије класа и МРО.
- Позовите метод у Суперкласи: Када се одреди суперкласа, супер() омогућава вам да позовете његове методе као да их позивате директно из поткласе. Ово вам омогућава да проширите или заобиђете методе док још увек користите оригиналну имплементацију из суперкласе.
Коришћење супер() у конструктору класа
Користећи супер() у конструктору класе је уобичајена пракса, пошто ћете често желети да иницијализујете заједничке атрибуте у родитељској класи и специфичније у детету.
Да би то демонстрирали, дефинише Питхон класу, оче, које сине класа наслеђује од:
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())
Унутар сине конструктор, позив на супер().инит() позива на оче конструктор класе, прослеђујући га име и презиме као параметри. Ово осигурава да се оче класа и даље може исправно поставити атрибуте имена, чак и на а сине објекат.
Ако се не јавите супер() у конструктору класе, конструктор његове родитељске класе се неће покренути. Ово може довести до нежељених последица, као што су недостајуће иницијализације атрибута или непотпуно подешавање стања родитељске класе:
...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...
Ако сада покушате да позовете добити информације метод, то ће подићи ан АттрибутеЕррор због селф.фирст_наме и селф.презиме атрибути нису иницијализовани.
Коришћење супер() у методама класе
Можете користити супер() у другим методама, осим у конструкторима, на исти начин. Ово вам омогућава да проширите или поништите понашање методе суперкласе.
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)
Тхе сине класа наслеђује од оче и има своје говорити методом. Тхе говорити методом сине класа користи супер().говори() да позовем говорити методом оче класа. Ово му омогућава да укључи поруку из надређене класе док је проширује поруком специфичном за подређену класу.
Неуспешно коришћење супер() у методи која замењује другу значи да функционалност присутна у методу родитељске класе неће ступити на снагу. Ово резултира потпуном заменом понашања методе, што може довести до понашања које нисте намеравали.
Разумевање редоследа решавања метода
Редослед решавања метода (МРО) је редослед којим Питхон претражује класе предака када приступате методу или атрибуту. МРО помаже Питхон-у да одреди који метод да позове када постоји више хијерархија наслеђивања.
classNigeria():
defculture(self):
print("Nigeria's culture")
classAfrica():
defculture(self):
print("Africa's culture")
Ево шта се дешава када креирате инстанцу Лагос разреда и позовите културе метод:
- Питхон почиње тако што тражи културе метода у Лагос сама класа. Ако га пронађе, позива метод. Ако не, прелази се на други корак.
- Ако не пронађе културе метода у Лагос класе, Питхон посматра основне класе редоследом којим се појављују у дефиницији класе. У овом случају, Лагос наслеђује прво од Африка а затим од Нигериа. Дакле, Питхон ће тражити културе метода у Африка први.
- Ако не пронађе културе метода у Африка класе, Питхон ће тада погледати у Нигериа класа. Ово понашање се наставља све док не дође до краја хијерархије и доведе до грешке ако не може да пронађе метод у било којој од суперкласа.
Излаз приказује редослед решавања метода Лагос, почевши с лева на десно.
Уобичајене замке и најбоље праксе
При раду са супер(), постоје неке уобичајене замке које треба избегавати.
- Имајте на уму редослед решавања метода, посебно у сценаријима вишеструког наслеђивања. Ако треба да користите сложено вишеструко наслеђивање, требало би да сте упознати са Ц3 Алгоритам линеаризације које Питхон користи за одређивање МРО.
- Избегавајте кружне зависности у хијерархији класа, што може довести до непредвидивог понашања.
- Документирајте свој код јасно, посебно када се користи супер() у сложеним хијерархијама класа, како би био разумљивији за друге програмере.
Користите супер() на прави начин
Питхон'с супер() функција је моћна функција када радите са наслеђивањем и заменом метода. Разумевање како супер() функционише и праћење најбољих пракси ће вам омогућити да креирате код у својим Питхон пројектима који је лакши и ефикаснији.