Je voudrais donner à une classe fille des attributs supplémentaires sans avoir à appeler explicitement une nouvelle méthode. Existe-t-il donc un moyen de donner à la classe héritée une méthode de type __init__
qui ne remplace pas la méthode __init__
de la classe parente?
J'ai écrit le code ci-dessous uniquement pour illustrer ma question (d'où la mauvaise désignation d'attributs, 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
Je vous remercie
Autant que je sache, ce n'est pas possible, mais vous pouvez appeler la méthode init de la superclasse, comme ceci:
class inheritedclass(initialclass):
def __init__(self):
initialclass.__init__(self)
self.attr3 = 'three'
Appelez simplement le __init__
du parent en utilisant super
:
class inheritedclass(initialclass):
def __new__(self):
self.attr3 = 'three'
super(initialclass, self).__init__()
Je conseille vivement de suivre les conventions de nommage de Python et de commencer un cours avec une lettre majuscule, par exemple. InheritedClass
et InitialClass
. Cela aide à distinguer rapidement les classes des méthodes et des variables.
Tout d’abord, vous mélangez __init__
et __new__
, ce sont des choses différentes . __new__
ne prend pas d'instance (self
) en argument, il prend la classe (cls
). En ce qui concerne l'essentiel de votre question, vous devez utiliser super
pour appeler le __init__
de la superclasse.
Votre code devrait ressembler à ceci:
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__()
C'est incroyablement simple. Définissez une nouvelle méthode __init__
et appelez le __init__
du parent au début.
# 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, vous n’avez pas à hériter explicitement de object
ou à passer la classe et self
à super
.
Appelez simplement une méthode désignée à partir de l'init du parent, si elle 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'