Питхон супер ()

Уграђени супер () враћа објект проки (привремени објекат суперкласе) који нам омогућава приступ методама основне класе.

У Питхону super()постоје два главна случаја употребе:

  • Омогућава нам да избегавамо експлицитно коришћење имена основне класе
  • Рад са вишеструким наслеђивањем

Пример 1: супер () са једним наслеђивањем

У случају појединачног наслеђивања, омогућава нам да основну класу упутимо према super().

 class Mammal(object): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') class Dog(Mammal): def __init__(self): print('Dog has four legs.') super().__init__('Dog') d1 = Dog()

Оутпут

Пас има четири ноге. Пас је топлокрвна животиња.

Овде смо позвали __init__()метод класе Маммал (из класе Дог) користећи код

 супер () .__ инит __ ('Пас')

уместо

 Сисари .__ инит __ (ја, 'пас')

Будући да не морамо да наводимо име основне класе када позивамо њене чланове, лако можемо да променимо име основне класе (ако је потребно).

 # changing base class to CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('Dog has four legs.') # no need to change this super().__init__('Dog')

super()Уграђени враћа проки објекат, објекат замену која може назвати методе базне класе преко делегације. То се назива индиректност (способност референцирања основног објекта super())

Будући да се индиректност израчунава током извођења, можемо користити различите основне класе у различито време (ако је потребно).

Пример 2: супер () са вишеструким наслеђивањем

 class Animal: def __init__(self, Animal): print(Animal, 'is an animal.'); class Mammal(Animal): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') super().__init__(mammalName) class NonWingedMammal(Mammal): def __init__(self, NonWingedMammal): print(NonWingedMammal, "can't fly.") super().__init__(NonWingedMammal) class NonMarineMammal(Mammal): def __init__(self, NonMarineMammal): print(NonMarineMammal, "can't swim.") super().__init__(NonMarineMammal) class Dog(NonMarineMammal, NonWingedMammal): def __init__(self): print('Dog has 4 legs.'); super().__init__('Dog') d = Dog() print('') bat = NonMarineMammal('Bat')

Оутпут

Пас има 4 ноге. Пас не зна да плива. Пас не може да лети. Пас је топлокрвна животиња. Пас је животиња. Слепи миш не може да плива. Слепи миш је топлокрвна животиња. Слепи миш је животиња.

Налог за решавање метода (МРО)

Налог за решавање метода (МРО) је редослед којим се методе морају наследити у присуству вишеструког наслеђивања. Помоћу __mro__атрибута можете погледати МРО .

 >>> Пас .__ мро__ (,,,,,)

Ево како МРО ради:

  • Метода у изведеним позивима увек се позива пре методе основне класе.
    У нашем примеру, класа Дог се позива пре НонМаринеМаммал или НонеВингедМаммал. Ове две класе се зову пре Сисара, што се назива пре Анимал, а класа Анимал пре објекта.
  • Ако постоји више родитеља попут њих Dog(NonMarineMammal, NonWingedMammal), прво се позивају методе НонМаринеМаммал, јер се оне појављују прве.

Да бисте сазнали више о томе super(), посетите Питхонов супер () који се сматра супер!

Занимљиви Чланци...