2012-05-02 26 views
16

To zbija mnie z tropu, że nigdzie nie mogę znaleźć jasnego wytłumaczenia tego. Dlaczego i kiedy należy wywołać metodę klasy bazowej wewnątrz metody o tej samej nazwie w klasie potomnej?Dziedziczenie w języku Python - wywoływanie metod klasy podstawowej w klasie potomnej?

class Child(Base): 
    def __init__(self): 
     Base.__init__(self) 

    def somefunc(self): 
     Base.somefunc(self) 

Zgaduję, że robisz to, gdy nie chcesz całkowicie nadpisać metody w klasie bazowej. czy to naprawdę wszystko?

Odpowiedz

2

To całkowicie zależy od klasy i metody.

Jeśli chcesz zrobić coś przed/po uruchomieniu metody bazowej lub wywołać ją z różnymi argumentami, oczywiście wywołaj metodę bazową w swojej metodzie podklasy.

Jeśli chcesz zastąpić całą metodę, oczywiście nie nazywasz tego.

+0

Jako uwaga boczna należy jednak zawsze wywoływać klasę rodzica "' __init__ ". – Amber

13

Zwykle robisz to, gdy chcesz rozszerzyć funkcjonalność, modyfikując, ale nie całkowicie zastępując metodę klasy bazowej. defaultdict jest dobrym tego przykładem:

class DefaultDict(dict): 
    def __init__(self, default): 
     self.default = default 
     dict.__init__(self) 

    def __getitem__(self, key): 
     try: 
      return dict.__getitem__(self, key) 
     except KeyError: 
      result = self[key] = self.default() 
      return result 

Zauważ, że właściwym sposobem na to jest do use super instead of directly calling the base class. W ten sposób:

class BlahBlah(someObject, someOtherObject): 
    def __init__(self, *args, **kwargs): 
     #do custom stuff 
     super(BlahBlah, self).__init__(*args, **kwargs) # now call the parent class(es) 
+0

Co jest takiego wspaniałego w funkcjach "super"? – user1369281

+5

@ user1369281: Cóż, nie zawsze są świetne. Jeśli jednak ich używasz konsekwentnie, znacznie ułatwiają pracę z drzewami spadkowymi. Co jeśli na przykład chciałem zmienić "defaultdict" na domyślny _edynowany_dict. Gdybym użył 'super()', jedyną rzeczą, którą musiałbym zmienić w moim kodzie byłaby definicja klasy. Wszystkie te "super" automatycznie odnoszą się do każdej klasy bazowej, z której dziedziczy moja obecna klasa. Ułatwia programowanie czarnej skrzynki. –

+0

Podoba mi się to, ponieważ przypomina ci (lub uczy), że twoja klasa może odziedziczyć wiele klas. Jeśli więc twoja klasa nadrzędna pochodzi z biblioteki lib, której nie możesz modyfikować i nie dziedziczy już obiektu, możesz po prostu dodać do klasy obiekt 'object'. – casey

Powiązane problemy