Python super ()

Funkcja wbudowana super () zwraca obiekt proxy (tymczasowy obiekt nadklasy), który umożliwia nam dostęp do metod klasy bazowej.

W Pythonie super()ma dwa główne przypadki użycia:

  • Pozwala nam uniknąć jawnego używania nazwy klasy bazowej
  • Praca z dziedziczeniem wielokrotnym

Przykład 1: super () z pojedynczym dziedziczeniem

W przypadku dziedziczenia pojedynczego pozwala nam odwoływać się do klasy bazowej przez 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()

Wynik

Pies ma cztery nogi. Pies jest zwierzęciem stałocieplnym.

Tutaj nazwaliśmy __init__()metodę klasy Mammal (z klasy Dog) za pomocą kodu

 super () .__ init __ ('Pies')

zamiast

 Mammal .__ init __ (self, 'Dog')

Ponieważ nie musimy określać nazwy klasy bazowej, gdy wywołujemy jej składowe, możemy łatwo zmienić nazwę klasy bazowej (jeśli zajdzie taka potrzeba).

 # changing base class to CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('Dog has four legs.') # no need to change this super().__init__('Dog')

Funkcja super()wbudowana zwraca obiekt proxy, obiekt zastępczy, który może wywoływać metody klasy bazowej poprzez delegację. Nazywa się to niezależnością (zdolność do odniesienia się do obiektu podstawowego za pomocą super())

Ponieważ niezależność jest obliczana w czasie wykonywania, możemy używać różnych klas bazowych w różnym czasie (jeśli zajdzie taka potrzeba).

Przykład 2: super () z dziedziczeniem wielokrotnym

 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')

Wynik

Pies ma 4 nogi. Pies nie umie pływać. Pies nie może latać. Pies jest zwierzęciem stałocieplnym. Pies to zwierzę. Nietoperz nie umie pływać. Nietoperz jest zwierzęciem stałocieplnym. Nietoperz to zwierzę.

Method Resolution Order (MRO)

Kolejność rozwiązywania metod (MRO) to kolejność, w jakiej metody powinny być dziedziczone w przypadku dziedziczenia wielokrotnego. Możesz wyświetlić MRO za pomocą __mro__atrybutu.

 >>> Pies .__ mro__ (,,,,,)

Oto jak działa MRO:

  • Metoda w wywołaniach pochodnych jest zawsze wywoływana przed metodą klasy bazowej.
    W naszym przykładzie klasa Dog jest wywoływana przed NonMarineMammal lub NoneWingedMammal. Te dwie klasy są wywoływane przed klasą Mammal, która jest wywoływana przed Animal, a klasa Animal jest wywoływana przed obiektem.
  • Jeśli istnieje wielu rodziców, takich jak Dog(NonMarineMammal, NonWingedMammal), metody NonMarineMammal są wywoływane jako pierwsze, ponieważ pojawiają się jako pierwsze.

Aby dowiedzieć się więcej super(), odwiedź stronę super () uznawaną za super () w Pythonie!

Interesujące artykuły...