2009-08-11 10 views
10

A może powinienem wyraźnie wskazać nadklasy, których metody chcę wywołać?Czy warto używać super() w Pythonie?

Wydaje się, że powtarzanie nazwisk super-klas wydaje się być kruchym przy odwoływaniu się do ich konstruktorów, ale ta strona podaje pewne dobre argumenty przeciwko używaniu super().

Odpowiedz

8

Książka Expert Python Programming omawia temat "super pułapek" w rozdziale 3. Warto przeczytać. Poniżej znajduje się wniosek książki:

Super użycie musi być spójne: w hierarchii klas super powinno być używane wszędzie lub nigdzie. Łączenie super i klasycznych połączeń to dezorientująca praktyka. Ludzie unikają super, ponieważ ich kod jest bardziej wyraźny.

Edytuj: Dziś ponownie czytam tę część książki. Skopiuję więcej zdań, ponieważ używanie super jest trudne:

  • Unikaj dziedziczenia w kodzie.
  • Zachowaj zgodność z jego użyciem i nie mieszaj nowego stylu ze starym stylem.
  • Sprawdź hierarchię klas przed wywołaniem jej metod w swojej podklasie.
1

Tak, po prostu trzymaj się argumentów słów kluczowych w swoich metodach __init__ i nie powinieneś mieć zbyt wielu problemów.

Zgadzam się, że jest on łamliwy, ale nie mniejszy niż użycie nazwy odziedziczonej klasy.

5

Możesz użyć super, ale jak mówi artykuł, są wady. Tak długo jak je znasz, nie ma problemu z używaniem tej funkcji. To tak, jakby ludzie mówili "używaj kompozycji, nie dziedziczenia" lub "nigdy nie używaj zmiennych globalnych". Jeśli ta funkcja istnieje, istnieje powód. Tylko pamiętaj, aby zrozumieć, dlaczego i co i mądrze ich używać.

+12

* "Jeśli funkcja istnieje, istnieje powód." * Ten argument jest po prostu nieprawdziwy. Wiele języków ma funkcje, z których nikt nie powinien korzystać. –

2

Bardzo lubię super(), ponieważ pozwala na zmianę odziedziczonej klasy (na przykład podczas refaktoryzacji i dodania klasy pośredniej) bez zmieniania jej na wszystkich metodach.

+2

, chyba że nie używasz jeszcze Pythona 3 (który jest w większości wykorzystywany przez Pythona) – nosklo

+1

Co masz na myśli? super() jest również w Pythonie 2. – juanjux

+0

Zostało przeniesione, jak sądzę. –

3

Problem, który ludzie mają z super, jest bardziej problemem wielokrotnego dziedziczenia. Więc jest trochę niesprawiedliwe obwinianie super. Bez dziedziczenia wielokrotnego jest jeszcze gorzej. Michele Simionato ładnie opakowane to w jego blog article na Super:

Z drugiej strony, można się zastanawiać, czy wszystkie Super brodawki nie są podpowiedzi niektórych poważny problem bazowego. Może to być problem z super, ani ze wspólnymi metodami: problem może być związany z wieloma dziedziczeniami .

Główna lekcja jest taka, że ​​należy unikać dziedziczenia wielokrotnego.

W interesie spójności zawsze używam super, nawet jeśli dla pojedynczego dziedziczenia nie ma to większego znaczenia (poza małą zaletą braku znajomości nazwy klasy nadrzędnej). W Pythonie 3+ super jest wygodniej, więc zdecydowanie powinieneś używać super.

2

super() próbuje rozwiązać problem wielokrotnego dziedziczenia; trudno jest powielić jego semantykę i na pewno nie powinieneś tworzyć żadnej nowej semantyki, chyba że jesteś całkowicie pewien.

Dla pojedynczego dziedziczenia, tam naprawdę nie ma różnicy między

class X(Y): 
    def func(self): 
     Y.func(self) 

i

class X(Y): 
    def func(self): 
     super().func() 

więc myślę, że to tylko kwestia gustu.

Powiązane problemy