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.
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:
- 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).
- 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.
- 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_nameclassSon(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 = hobbydefget_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:
- 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.
- 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.
- 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ć.
- 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.
- Unikaj zależności cyklicznych w hierarchii klas, które mogą prowadzić do nieprzewidywalnego zachowania.
- 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.