Je lisais '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.
- Et si cette
FileInfo
classe avait plus d'une classe d'ancêtres?- Dois-je appeler explicitement toutes les
__init__
méthodes des classes ancêtres ?
- Dois-je appeler explicitement toutes les
- Dois-je également le faire pour toute autre méthode que je souhaite remplacer?
python
overriding
superclass
liewl
la source
la source
Réponses:
Le livre est un peu daté en ce qui concerne les appels de sous-classe-superclasse. Il est également un peu daté en ce qui concerne la sous-classification des classes intégrées.
Cela ressemble à ceci de nos jours:
Notez ce qui suit:
Nous pouvons sous - classe directement intégrée dans les classes, comme
dict
,list
,tuple
, etc.La
super
fonction gère le suivi des superclasses de cette classe et l'appel des fonctions dans celles-ci de manière appropriée.la source
Dans chaque classe dont vous devez hériter, vous pouvez exécuter une boucle de chaque classe qui doit être initiée lors de l'initiation de la classe enfant ... un exemple qui peut être copié pourrait être mieux compris ...
la source
Child.__init__
soit nécessaire. Quand je le retire de l'exemple, mon enfant imprime toujours "Grandma". L'init grand-parent n'est-elle pas gérée par laParent
classe?Vous n'avez pas vraiment besoin d'appeler les
__init__
méthodes de la (des) classe (s) de base, mais vous voulez généralement le faire parce que les classes de base y effectueront des initialisations importantes qui sont nécessaires pour que les autres méthodes de classes fonctionnent.Pour les autres méthodes, cela dépend de vos intentions. Si vous voulez simplement ajouter quelque chose au comportement des classes de base, vous voudrez appeler la méthode des classes de base en plus de votre propre code. Si vous souhaitez modifier fondamentalement le comportement, vous ne pouvez pas appeler la méthode de la classe de base et implémenter toutes les fonctionnalités directement dans la classe dérivée.
la source
Si la classe FileInfo a plus d'une classe ancêtre, vous devez absolument appeler toutes leurs fonctions __init __ (). Vous devez également faire de même pour la fonction __del __ (), qui est un destructeur.
la source
Oui, vous devez appeler
__init__
pour chaque classe parent. Il en va de même pour les fonctions, si vous remplacez une fonction qui existe dans les deux parents.la source