2010-04-28 18 views
8

Alle von einer bestimmten Basisklasse abgeleiteten Klassen müssen ein Attribut namens "path" definieren. Im Sinne der Ente eingeben konnte ich auf Definition verlassen in den Unterklassen:Parameter an Basisklassenkonstruktor übergeben oder Instanzvariable verwenden?

class Base: 
    pass # no "path" variable here 

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

Eine andere Möglichkeit wäre es, die Basisklassenkonstruktor zu verwenden:

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

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

verwende ich Python 3.1.

Was würden Sie bevorzugen und warum? Gibt es einen besseren Weg?

Antwort

11

In Python 3.0 oder höher:
ich mit einem Parameter der Basisklasse Konstruktor gehen würde, wie Sie im zweiten Beispiel haben. Dadurch werden Klassen erzwungen, die von Base abgeleitet sind, um die erforderliche Pfadeigenschaft bereitzustellen, die die Tatsache dokumentiert, dass die Klasse eine solche Eigenschaft aufweist und dass abgeleitete Klassen diese bereitstellen müssen. Ohne es würden Sie sich darauf verlassen, dass dies irgendwo in den Docstrings Ihrer Klasse angegeben (und gelesen) wird, obwohl es sicherlich hilft, auch im Docstring anzugeben, was die bestimmte Eigenschaft bedeutet.

In Python 2.6+:
ich keine der oben genannten verwenden würde; stattdessen würde ich verwenden:

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

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

Mit anderen Worten, würde ich ein solche Parameter in der Konstruktor der Basisklasse erfordert, weil es die Tatsache, dass alle diese Arten dokumentiert haben/Nutzung/müssen, dass bestimmte Parameter und dass der Parameter muss zur Verfügung gestellt werden. Allerdings würde ich nicht super() als super is somewhat fragile and dangerous in Python verwenden, und ich würde auch Basis eine new-style class durch Erben von Objekt (oder von einigen anderen neuen Stil) -Klasse.

+5

Es gibt nichts Zerbrechliches an 'super()'. Die Fragilität ist in der 2.x-Syntax, die in 3.x (die das OP verwendet, wie durch den Aufruf 'super() 'gezeigt wird), und Mehrfachvererbung im Allgemeinen behoben. Es gibt keinen Grund, die baseclass-Methode direkt in Python 3.x zu verwenden, die 'super() .__ init (...)' -Syntax ist niemals schlechter und oft besser. –

+0

durch die Verwendung von "Super" zu urteilen, würde ich vermuten, dass Deamon py3k verwendet – SilentGhost

+0

@Thomas Wouters: Wie würden Sie Super verwenden, wenn Sie alle mehrere Vererbungs- und Basisklassen mit verschiedenen Konstruktorsignaturen? Alle Argumente abgeleiteter Klassen an alle Basisklassen zu übergeben sieht wie ein schmutziger Hack aus, der sich auf benannte Parameter stützt und Basisklassen aussortieren lässt, was sie brauchen, ist nicht viel schöner. – kriss

Verwandte Themen