147 votes

Héritage et dérogation __init__ en python

J'étais en train de lire "Dive Into Python" et dans le chapitre sur les classes, il donne cet exemple:

class FileInfo(UserDict):
    "store file metadata"
    def __init__(self, filename=None):
        UserDict.__init__(self)
        self["name"] = filename

L'auteur dit ensuite que, si vous souhaitez remplacer l' __init__ méthode, vous devez appeler explicitement le parent __init__ avec les paramètres corrects.

  1. Si ce FileInfo classe avait plus d'une classe ancêtre?
    • Dois-je appeler explicitement l'ensemble de l'ancêtre des classes' __init__ méthodes?
  2. Aussi, dois-je le faire pour toute autre méthode, je veux remplacer?

179voto

S.Lott Points 207588

Le livre est un peu daté à l'égard de sous-classe de super-classe de l'appelant. C'est aussi un peu daté à l'égard de la sous-classe intégrée dans les classes.

Ça ressemble à ça aujourd'hui.

class FileInfo(dict):
    """store file metadata"""
    def __init__(self, filename=None):
        super( FileInfo, self ).__init__()
        self["name"] = filename

Notez les points suivants.

  1. Nous pouvons directement la sous-classe classes intégrées, comme dict, list, tuple, etc.

  2. L' super fonction gère la traque de cette classe de super-classes et d'appeler les fonctions de façon appropriée.

22voto

Code Bug Points 121

Dans chaque classe dont vous devez hériter, vous pouvez exécuter une boucle de chaque classe à initier lors de l'initiation de la classe enfant ... un exemple copiable peut être mieux compris ...

 class Female_Grandparent:
    def __init__(self):
        self.grandma_name = 'Grandma'

class Male_Grandparent:
    def __init__(self):
        self.grandpa_name = 'Grandpa'

class Parent(Female_Grandparent, Male_Grandparent):
    def __init__(self):
        Female_Grandparent.__init__(self)
        Male_Grandparent.__init__(self)

        self.parent_name = 'Parent Class'

class Child(Parent):
    def __init__(self):
        Parent.__init__(self)
#---------------------------------------------------------------------------------------#
        for cls in Parent.__bases__: # This block grabs the classes of the child
             cls.__init__(self)      # class (which is named 'Parent' in this case), 
                                     # and iterates through them, initiating each one.
                                     # The result is that each parent, of each child,
                                     # is automatically handled upon initiation of the 
                                     # dependent class. WOOT WOOT! :D
#---------------------------------------------------------------------------------------#



g = Female_Grandparent()
print g.grandma_name

p = Parent()
print p.grandma_name

child = Child()

print child.grandma_name
 

18voto

sth Points 91594

Vous n'avez pas vraiment avoir à appeler l' __init__ méthodes de la classe de base(es), mais vous souhaitez le faire parce que les classes de base sera important d'initialisation qui sont nécessaires pour le reste de la classe les méthodes de travail.

Pour les autres méthodes, il dépend de vos intentions. Si vous souhaitez simplement ajouter quelque chose à la base des classes de comportement que vous voulez appeler les classes de base de la méthode en plus de votre propre code. Si vous voulez changer fondamentalement le comportement, vous risquez de ne pas appeler la classe de base de la méthode et de mettre en œuvre toutes les fonctionnalités directement dans la classe dérivée.

4voto

marcog Points 39356

Si la classe FileInfo a plus d'une classe ancêtre, vous devez absolument appeler toutes leurs fonctions __init __ (). Vous devriez également faire la même chose pour la fonction __del __ (), qui est un destructeur.

2voto

vezult Points 3812

Oui, vous devez appeler __init__ pour chaque classe parente. Il en va de même pour les fonctions, si vous substituez une fonction qui existe dans les deux parents.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X