2012-10-03 24 views
21

Ho creato una classe di base:come estendere Python classe init

class Thing(): 
    def __init__(self, name): 
     self.name = name 

voglio estendere la classe e aggiungere alla metodo di init in modo che il che SubThing ha sia una name e una proprietà time. Come lo faccio?

class SubThing(Thing): 
    # something here to extend the init and add a "time" property 

    def __repr__(self): 
     return '<%s %s>' % (self.name, self.time) 

Qualsiasi aiuto sarebbe fantastico.

risposta

27

Si può solo definire __init__ nella sottoclasse e chiamare super chiamare __init__ metodi dei genitori in modo appropriato:

class SubThing(Thing): 
    def __init__(self, *args, **kwargs): 
     super(SubThing, self).__init__(*args, **kwargs) 
     self.time = datetime.now() 

Assicuratevi di avere il vostro sottoclasse classe di base da object anche se, come super non funzionerà con le classi vecchio stile:

class Thing(object): 
    ... 
+14

Inoltre, invece di fare riferimento a 'Sottothing' in' super', puoi fare 'super (self .__ class__, self) .__ init __ (* args, ** kwargs)'. Questo funziona anche con classi create dinamicamente usando 'type()'. – miki725

+3

Ottengo questo errore con una di queste soluzioni: 'TypeError: deve essere type, not classobj' - l'errore viene attivato dalla mia super linea. – TheChymera

+1

@TheChymera guarda cosa ha scritto Jesse: "Assicurati di avere la sottoclasse della tua classe base dall'oggetto, dato che super non funzionerà con le classi vecchio stile" – Acsisr