Встроенная функция super () возвращает прокси-объект (временный объект суперкласса), который позволяет нам получить доступ к методам базового класса.
В Python super()
есть два основных варианта использования:
- Позволяет избежать явного использования имени базового класса
- Работа с множественным наследованием
Пример 1: super () с одинарным наследованием
В случае одиночного наследования это позволяет нам ссылаться на базовый класс с помощью 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()
Встроенный возвращает прокси - объект, объект замены , который может вызывать методы базового класса посредством делегирования. Это называется косвенным обращением (возможность ссылаться на базовый объект с помощью super()
)
Поскольку косвенное обращение вычисляется во время выполнения, мы можем использовать разные базовые классы в разное время (если нам нужно).
Пример 2: super () с множественным наследованием
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__ (,,,,,)
Вот как работает ТОиР:
- Метод в производных вызовах всегда вызывается перед методом базового класса.
В нашем примере класс Dog вызывается перед NonMarineMammal или NoneWingedMammal. Эти два класса вызываются перед Mammal, который вызывается перед Animal, а класс Animal вызывается перед объектом. - Если есть несколько родителей, например
Dog(NonMarineMammal, NonWingedMammal)
, методы NonMarineMammal вызываются первыми, потому что они появляются первыми.
Чтобы узнать больше super()
, посетите Python super (), который считается супер!