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.