Héritage et Primordial __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 la __init__
méthode, vous devez appeler explicitement le parent __init__
avec les paramètres corrects.
- 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?
- Dois-je appeler explicitement l'ensemble de l'ancêtre des classes
- Aussi, dois-je le faire pour toute autre méthode, je veux remplacer?
- Notez que la Surcharge est une notion distincte de remplacer.
Vous devez vous connecter pour publier un commentaire.
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 sous-classement intégrés dans les classes.
Ça ressemble à ça aujourd'hui:
Noter les points suivants:
Nous pouvons directement la sous-classe classes intégrées, comme
dict
,list
,tuple
, etc.La
super
fonction gère la traque de cette classe de super-classes et d'appeler les fonctions de façon appropriée.Dans chaque catégorie que vous souhaitez hériter du, vous pouvez exécuter une boucle de chaque classe qui en a besoin init avais lors de l'initiation de l'enfant de la classe...un exemple qui peuvent être copiés pourraient être mieux compris...
Child.__init__
est nécessaire. Lorsque je le supprime de l'exemple que j'ai de l'enfant imprime toujours "grand-mère". N'est pas grand-parent init traitées par leParent
classe?Vous n'avez pas vraiment ont d'appeler le
__init__
méthodes de la classe de base(es), mais vous voulez de 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.
Si la classe FileInfo a plus d'une classe ancêtre, alors vous devriez certainement appel à tous leurs __init__() de fonctions. Vous devriez également faire de même pour l' __del__() de la fonction, qui est un destructeur.
Oui, vous devez appeler
__init__
pour chaque classe parent. Il en va de même pour les fonctions, si vous écrasez une fonction qui existe dans les deux parents.