Python redéfinition de Méthode, ne la signature de la matière?
Permet de dire que j'ai
class Super():
def method1():
pass
class Sub(Super):
def method1(param1, param2, param3):
stuff
Est-ce correct? Aura des appels à method1 toujours aller à la sous-classe? Mon plan est de 2 sous classes de chaque remplacement method1 avec différents paramètres
Vous devez vous connecter pour publier un commentaire.
Python permettra à cela, mais si
method1()
est destiné à être exécuté à partir d'un code externe, alors vous pouvez vouloir reconsidérer cette, car elle viole LSP et donc ne fonctionne pas toujours correctement.Super.method1(param1=None, param2=None, param3=None)
il serait encore violer LSP si sur les sous-classes il est défini commeSub.method1(param1, param2, param3)
droit? En tant qu'attributs sont obligatoires dans un cas mais pas dans l'autre. Donc à ma connaissance, sans modification de la sous-classe de l'interface, la seule façon de ne pas enfreindre LSP serait d'avoir les paramètres sans valeurs par défaut sur le parent. Suis-je correct sur ce ou de sur-interpréter le LSP?Python permet de "substitution" des méthodes avec des signatures différentes, mais vous ne pouvez jamais avoir deux méthodes avec le même nom dans la même classe, même si leurs signatures sont différentes (pas de surcharge de la méthode). Dans le cas de la méthode de remplacement, si vous appelez les méthodes avec le mauvais nombre de paramètres définis pour l'objet, vous obtiendrez une erreur. Rappelez-vous, Python méthodes sont juste des paires clé-valeur dans dictionnaire attaché à l'objet, et "substitution de" d'un montant de simplement remplacer la valeur dans le dictionnaire copié d'abord à partir de la classe de base dictionnaire pour la même clé.
Il y a souvent des scénarios où vous souhaitez méthode de la classe dérivée ont supplémentaires paramètres de la classe de base. Pour ce faire en Python tout en préservant LSP, vous pouvez utiliser la technique suivante:
Ci-dessus affichera:
Jouer avec ce code
En python, toutes les méthodes de la classe sont "virtuels" (en termes de C++). Ainsi, dans le cas de votre code, si vous souhaitez appeler
method1()
dans la super-classe, il faut:Et la signature de la méthode a de l'importance. Vous ne pouvez pas appeler une méthode comme ceci:
Cela fonctionne:
Cependant, ce n'est généralement pas recommandé. Jetez un oeil à S. Lott's réponse: Méthodes avec le même nom et les différents arguments sont d'une odeur de code.
Vous pourriez faire quelque chose comme ceci si c'est ok pour utiliser la valeur par défaut arguments:
Oui. Les appels à "method1" la volonté de toujours aller à la sous-classe. Signature de la méthode en Python uniquement composé du nom et de ne pas la liste d'arguments.