Вградената функция 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, считан за супер!