Python супер ()

Встроенная функция 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 (), который считается супер!

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