2012-10-03 17 views
21

Stworzyłem klasę bazową:Jak przedłużyć Python class Init

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

Chcę rozszerzyć klasę i dodać do Init metody tak, że SubThing ma zarówno name i właściwość time. Jak mam to zrobić?

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

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

Każda pomoc będzie niesamowita.

Odpowiedz

27

można tylko określić __init__ w podklasy i wywołać super zadzwonić __init__ metod rodziców odpowiednio:

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

Upewnij się, aby mieć swoje klasy bazowej podklasę z object choć, jak super nie będzie działać w klasach starego stylu:

class Thing(object): 
    ... 
+14

Zamiast przywoływania 'SubThing' w' super', możesz zrobić 'super (self .__ class__, self) .__ init __ (* args, ** kwargs)'. Działa to również z dynamicznie tworzonymi klasami przy użyciu 'type()'. – miki725

+3

Otrzymuję ten błąd z jednym z tych rozwiązań: 'TypeError: must be type, not classobj' - błąd jest wywoływany przez moją superlinię. – TheChymera

+1

@ TheChymera spójrz na to, co Jesse napisał: "Upewnij się jednak, że masz podklasę klasy podstawowej od obiektu, ponieważ super nie działa z klasami starego stylu" – Acsisr