Python super ()

Вбудований файл 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, який вважається супер!

Цікаві статті...