2010-04-28 36 views
8

Wszystkie klasy wyprowadzone z pewnej klasy bazowej muszą zdefiniować atrybut o nazwie "ścieżka". W sensie kaczka wpisywanie mogę polegać w definicji podklasy:Przekazywanie parametru do konstruktora klasy podstawowej lub użycie zmiennej instancji?

class Base: 
    pass # no "path" variable here 

def Sub(Base): 
    def __init__(self): 
     self.path = "something/" 

Kolejna możliwo byłoby użyć konstruktora klasy bazowej:

class Base: 
    def __init__(self, path): 
     self.path = path 

def Sub(Base): 
    def __init__(self): 
     super().__init__("something/") 

używam Python 3.1.

Co byś chciał i dlaczego? Czy istnieje lepszy sposób?

Odpowiedz

11

W Pythonie 3.0+:
pójdę z parametr do konstruktora klasy bazowej jak masz w drugim przykładzie. Ponieważ wymusza to klasy wywodzące się z bazy, aby zapewnić niezbędną własność ścieżki, co dokumentuje fakt, że klasa ma taką właściwość i że klasy pochodne są wymagane do jej dostarczenia. Bez tego można by polegać na tym, że jest to stwierdzone (i przeczytane) gdzieś w doktrynie twojej klasy, chociaż z pewnością pomaga to również w określeniu, co konkretna właściwość oznacza.

W języku Python 2.6+:
Nie użyłbym żadnego z powyższych; zamiast użyłbym:

class Base(object): 
    def __init__(self,path): 
     self.path=path; 

class Sub(Base): 
    def __init__(self): 
     Base.__init__(self,"something/") 

Innymi słowy, chciałbym wymagają takiego parametru w konstruktorze klasy bazowej, ponieważ dokumentuje fakt, że wszystkie te typy będą mieć/użytkowania/trzeba, że ​​dany parametr i że parametr musi być udowodnione. Jednak nie użyłbym super() jako super is somewhat fragile and dangerous in Python, a także uczyniłbym Base a new-style class dziedzicząc z klasy object (lub z jakiejś innej klasy w nowym stylu).

+5

W "super()" nie ma nic niestabilnego. Kruchość jest w składni 2.x, która jest ustalona w 3.x (z której korzysta OP, jak pokazano przez wywołanie 'super()') i ogólnie dziedziczenia wielokrotnego. Nie ma żadnego powodu, który mógłby nazwać metodę baseclass bezpośrednio w Pythonie 3.x, składnia 'super() .__ init (...)' nigdy nie jest gorsza i często lepsza. –

+0

sądząc z użycia 'super', domyślam się, że Deamon używa py3k – SilentGhost

+0

@Thomas Wouters: w jaki sposób używałbyś super, jeśli posiadasz wiele klas dziedziczenia i bazowych z różnymi sygnaturami konstruktora? Przekazywanie wszystkich argumentów klas pochodnych do wszystkich klas bazowych wygląda jak brudny hack, polegając na nazwanych parametrach i niech klasy bazowe porządkują to, czego potrzebują, nie są o wiele ładniejsze. – kriss

Powiązane problemy