Python супер ()

Вградената функция super () връща прокси обект (временен обект на суперкласа), който ни позволява достъп до методи на базовия клас.

В Python 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__()извикахме метода на класа Mammal (от клас Dog), използвайки код

 super () .__ init __ ('Куче')

вместо

 Бозайник .__ 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()BUILTIN връща прокси обект, обект заместител, който може да се обадя методи на базовия клас чрез делегиране. Това се нарича индирекция (способност за препращане към основен обект с 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)

Ред за разрешаване на методи (MRO) е редът, при който методите трябва да бъдат наследени при наличие на множествено наследяване. Можете да видите MRO, като използвате __mro__атрибута.

 >>> Куче .__ mro__ (,,,,,)

Ето как работи MRO:

  • Методът в получените извиквания винаги се извиква преди метода на базовия клас.
    В нашия пример класът Dog се извиква преди NonMarineMammal или NoneWingedMammal. Тези два класа се извикват преди Mammal, което се извиква преди Animal, а клас Animal се извиква преди обекта.
  • Ако има много родители като Dog(NonMarineMammal, NonWingedMammal), първо се извикват методи на NonMarineMammal, защото той се появява първи.

За да научите повече за super(), посетете супер () на Python, считан за супер!

Интересни статии...