multiple method classes python oop inheritance

method - Python__init__ método en la clase heredada



python inheritance super (5)

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 de un object o pasar la clase y self a super .

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''


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__()


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''


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.