Вбудований файл 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__()
метод класу ссавців (із класу собак) за допомогою коду
super () .__ init __ ('Собака')
замість
Ссавці .__ init __ (self, 'Dog')
Оскільки нам не потрібно вказувати ім’я базового класу, коли ми викликаємо його членів, ми можемо легко змінити ім’я базового класу (якщо нам потрібно).
# 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__ (,,,,,)
Ось як працює MRO:
- Метод у похідних викликах завжди викликається перед методом базового класу.
У нашому прикладі клас Dog викликається перед NonMarineMammal або NoneWingedMammal. Ці два класи викликаються перед Ссавцем, що викликається перед Animal, а клас Animal - перед об'єктом. - Якщо є кілька батьків, подібних
Dog(NonMarineMammal, NonWingedMammal)
, спочатку викликаються методи NonMarineMammal, оскільки вони з’являються першими.
Щоб дізнатись більше про це super()
, відвідайте супер () Python, який вважається супер!