Dziedziczenie jest przydatne, ale można uwolnić jego pełny potencjał, ponownie wykorzystując kod z klas bazowych.

Kluczowe dania na wynos

  • Funkcja super() w Pythonie umożliwia wywoływanie metod nadklasy z podklasy, co ułatwia implementację dziedziczenia i przesłaniania metod.
  • Funkcja super() jest ściśle powiązana z kolejnością rozpoznawania metod (MRO) w Pythonie, która określa kolejność, w jakiej przeszukiwane są klasy-przodki w poszukiwaniu metod lub atrybutów.
  • Używanie super() w konstruktorach klas jest powszechną praktyką inicjowania wspólnych atrybutów w klasie nadrzędnej i bardziej szczegółowych w klasie podrzędnej. Niezastosowanie funkcji super() może prowadzić do niezamierzonych konsekwencji, takich jak brak inicjalizacji atrybutów.

Jedną z podstawowych cech Pythona jest paradygmat OOP, którego można używać do modelowania bytów ze świata rzeczywistego i ich relacji.

Pracując z klasami w języku Python, często będziesz korzystać z dziedziczenia i zastępowania atrybutów lub metod nadklasy. Python zapewnia Super() funkcja, która pozwala wywoływać metody nadklasy z podklasy.

instagram viewer

Co to jest super() i dlaczego jest potrzebne?

Korzystając z dziedziczenia, możesz utworzyć nową klasę Pythona, która dziedziczy funkcje istniejącej klasy. Możesz także zastąpić metody nadklasy w podklasie, zapewniając alternatywne implementacje. Możesz jednak chcieć używać nowej funkcjonalności jako dodatku do starej, a nie zamiast niej. W tym przypadku, Super() jest przydatne.

Możesz skorzystać z Super() funkcja umożliwiająca dostęp do atrybutów nadklasy i wywoływanie metod nadklasy. Super jest niezbędny programowanie obiektowe ponieważ ułatwia to implementację dziedziczenia i przesłaniania metod.

Jak działa super()?

Wewnętrznie, Super() jest ściśle powiązany z Metoda Rozdzielczość Kolejność (MRO) w Pythonie, co określa algorytm linearyzacji C3.

Oto jak Super() Pracuje:

  1. Określ bieżącą klasę i instancję: Kiedy zadzwonisz Super() wewnątrz metody podklasy Python automatycznie określa bieżącą klasę (klasę zawierającą metodę, która wywołała Super()) i instancję tej klasy (tj. samego siebie).
  2. Określ nadklasę: Super() pobiera dwa argumenty — bieżącą klasę i instancję — których nie trzeba przekazywać jawnie. Używa tych informacji do określenia nadklasy do delegowania wywołania metody. Dokonuje tego poprzez badanie hierarchii klas i MRO.
  3. Wywołaj metodę w nadklasie: Po określeniu nadklasy, Super() pozwala wywoływać jej metody tak, jakbyś wywoływał je bezpośrednio z podklasy. Umożliwia to rozszerzanie lub zastępowanie metod przy jednoczesnym korzystaniu z oryginalnej implementacji z nadklasy.

Używanie super() w konstruktorze klas

Za pomocą Super() w konstruktorze klas jest powszechną praktyką, ponieważ często będziesz chciał zainicjować wspólne atrybuty w klasie nadrzędnej i bardziej szczegółowe w klasie podrzędnej.

Aby to zademonstrować, zdefiniuj klasę Pythona, Ojciec, która Syn klasa dziedziczy po:

classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name

classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
# Call the parent class constructor (Father)
super().__init__(first_name, last_name)

self.age = age
self.hobby = hobby

defget_info(self):
returnf"Son's Name: {self.first_name}{self.last_name}, \
Son's Age: {self.age}, Son's Hobby: {self.hobby}"

# Create an instance of the Son class
son = Son("Pius", "Effiong", 25, "Playing Guitar")

# Access attributes
print(son.get_info())

W środku Syn konstruktor, wywołanie super().init() przywołuje Ojciec konstruktor klasy, przekazując go imię I nazwisko jako parametry. Zapewnia to, że Ojciec class może nadal poprawnie ustawiać atrybuty nazw, nawet na pliku Syn obiekt.

Jeśli nie zadzwonisz Super() w konstruktorze klasy konstruktor klasy nadrzędnej nie zostanie uruchomiony. Może to prowadzić do niezamierzonych konsekwencji, takich jak brak inicjacji atrybutów lub niekompletna konfiguracja stanu klasy nadrzędnej:

...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...

Jeśli teraz spróbujesz zadzwonić do zdobyć informacje metodą, spowoduje to podniesienie Błąd atrybutu ponieważ własne.imię I własne.nazwisko atrybuty nie zostały zainicjowane.

Używanie super() w metodach klas

Możesz użyć Super() innymi metodami, poza konstruktorami, w ten sam sposób. Pozwala to rozszerzyć lub zastąpić zachowanie metody nadklasy.

classFather:
defspeak(self):
return"Hello from Father"

classSon(Father):
defspeak(self):
# Call the parent class's speak method using super()
parent_greeting = super().speak()
returnf"Hello from Son\n{parent_greeting}"

# Create an instance of the Son class
son = Son()

# Call the speak method of the Son class
son_greeting = son.speak()

print(son_greeting)

The Syn klasa dziedziczy z Ojciec i ma swoje mówić metoda. The mówić metoda Syn klasa używa super().mów() zadzwonić do mówić metoda Ojciec klasa. Pozwala to na dołączenie wiadomości z klasy nadrzędnej i rozszerzenie jej o wiadomość specyficzną dla klasy podrzędnej.

Nieużywany Super() w metodzie, która zastępuje inną, oznacza, że ​​funkcjonalność obecna w metodzie klasy nadrzędnej nie będzie działać. Powoduje to całkowite zastąpienie zachowania metody, co może prowadzić do niezamierzonego zachowania.

Zrozumienie kolejności rozstrzygania metod

Kolejność rozpoznawania metod (MRO) to kolejność, w jakiej Python przeszukuje klasy przodków, gdy uzyskujesz dostęp do metody lub atrybutu. MRO pomaga Pythonowi określić, którą metodę wywołać, gdy istnieje wiele hierarchii dziedziczenia.

classNigeria():
defculture(self):
print("Nigeria's culture")

classAfrica():
defculture(self):
print("Africa's culture")

Oto, co się stanie, gdy utworzysz instancję pliku Lagos zajęcia i zadzwoń kultura metoda:

  1. Python zaczyna od wyszukania pliku kultura metoda w Lagos sama klasa. Jeśli go znajdzie, wywołuje metodę. Jeżeli nie, przechodzimy do kroku drugiego.
  2. Jeśli nie znajdzie kultura metoda w Lagos class, Python przegląda klasy bazowe w kolejności, w jakiej występują w definicji klasy. W tym przypadku, Lagos dziedziczy w pierwszej kolejności od Afryka a potem od Nigeria. Zatem Python będzie szukać pliku kultura metoda w Afryka Pierwszy.
  3. Jeśli nie znajdzie kultura metoda w Afryka klasie, Python następnie zajrzy do pliku Nigeria klasa. To zachowanie trwa aż do osiągnięcia końca hierarchii i zgłasza błąd, jeśli nie można znaleźć metody w żadnej z nadklas.

Dane wyjściowe pokazują kolejność rozstrzygania metod Lagos, zaczynając od lewej do prawej.

Typowe pułapki i najlepsze praktyki

Podczas pracy z Super(), istnieje kilka typowych pułapek, których należy unikać.

  1. Należy pamiętać o kolejności rozstrzygania metod, szczególnie w scenariuszach wielokrotnego dziedziczenia. Jeśli potrzebujesz zastosować złożone dziedziczenie wielokrotne, powinieneś zapoznać się z C3 Algorytm linearyzacji którego Python używa do określenia MRO.
  2. Unikaj zależności cyklicznych w hierarchii klas, które mogą prowadzić do nieprzewidywalnego zachowania.
  3. Udokumentuj swój kod w przejrzysty sposób, zwłaszcza podczas używania Super() w złożonych hierarchiach klas, aby było bardziej zrozumiałe dla innych programistów.

Używaj super() we właściwy sposób

Pythona Super() Funkcja jest potężną funkcją, gdy pracujesz z dziedziczeniem i zastępowaniem metod. Zrozumienie jak Super() działa, a przestrzeganie najlepszych praktyk pozwoli Ci stworzyć łatwiejszy w utrzymaniu i wydajny kod w projektach Pythona.