Python __init__ método en la clase heredada

Me gustaría darle a una clase hija algunos atributos adicionales sin tener que llamar explícitamente a un nuevo método. Entonces, ¿hay una manera de darle a la clase heredada un método de tipo __init__ que no __init__ método __init__ de la clase principal?

He escrito el código a continuación únicamente para ilustrar mi pregunta (de ahí la mala denominación de los atributos, etc.).

 class initialclass(): def __init__(self): self.attr1 = 'one' self.attr2 = 'two' class inheritedclass(initialclass): def __new__(self): self.attr3 = 'three' def somemethod(self): print 'the method' a = inheritedclass() for each in a.__dict__: print each #I would like the output to be: attr1 attr2 attr3 

Gracias

Por lo que sé, eso no es posible, sin embargo, puede llamar al método init de la superclase, como este:

 class inheritedclass(initialclass): def __init__(self): initialclass.__init__(self) self.attr3 = 'three' 

Simplemente llame al __init__ los padres usando super :

 class inheritedclass(initialclass): def __new__(self): self.attr3 = 'three' super(initialclass, self).__init__() 

Recomiendo encarecidamente seguir las convenciones de nomenclatura de Python y comenzar una clase con una letra mayúscula, por ejemplo, InheritedClass y InitialClass . Esto ayuda a distinguir rápidamente las clases de los métodos y las variables.

Primero que todo, estás mezclando __init__ y __new__ , son cosas diferentes . __new__ no toma instancia ( self ) como argumento, toma clase ( cls ). En cuanto a la parte principal de su pregunta, lo que debe hacer es usar super para invocar la superclase ‘ __init__ .

Tu código debería verse así:

 class initialclass(object): def __init__(self): self.attr1 = 'one' self.attr2 = 'two' class inheritedclass(initialclass): def __init__(self): self.attr3 = 'three' super(inheritedclass, self).__init__() 

Es increíblemente simple. Defina un nuevo método __init__ y llame al __init__ los padres al principio.

 # assuming a class Base, its __init__ takes one parameter x class Derived(Base): def __init__(self, x, y): # whatever initialization is needed so we can say Derived is-a Base super(Derived, self).__init__(x) # now, add whatever makes Derived special - do your own initialization self.y = y 

En Python 3, no tiene que (y, por lo tanto, probablemente no debería, por simplicidad) heredar explícitamente del object o pasar la clase y self a super .

Simplemente llame a un método designado desde el inicio del padre, si existe:

 class initialclass(): def __init__(self): self.attr1 = 'one' self.attr2 = 'two' if hasattr(self, 'init_subclass'): self.init_subclass() class inheritedclass(initialclass): def init_subclass(self): self.attr3 = 'three'