web-dev-qa-db-fra.com

méthode python __init__ en classe héritée

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

19
Anake

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

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.

16
Adam Matan

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

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.

3
user395760

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'
0
Lauritz V. Thaulow