J'essaie d'implémenter la surcharge de méthode en Python:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow(2)
mais la sortie est second method 2
; De même:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow()
donne
Traceback (most recent call last):
File "my.py", line 9, in <module>
ob.stackoverflow()
TypeError: stackoverflow() takes exactly 2 arguments (1 given)
Comment faire fonctionner cela?
python
class
overloading
user1335578
la source
la source
Réponses:
C'est une surcharge de méthode et non un remplacement de méthode . Et en Python, vous faites tout cela dans une seule fonction:
Vous ne pouvez pas avoir deux méthodes avec le même nom en Python - et vous n'en avez pas besoin.
Consultez la section Valeurs d'argument par défaut du didacticiel Python. Voir «Least Astonishment» et l'argument Mutable Default pour une erreur courante à éviter.
Edit : Voir PEP 443 pour plus d'informations sur les nouvelles fonctions génériques de répartition unique dans Python 3.4.
la source
Vous pouvez également utiliser pythonlangutil :
la source
En Python, vous ne faites pas les choses de cette façon. Quand les gens font cela dans des langages comme Java, ils veulent généralement une valeur par défaut (s'ils ne le font pas, ils veulent généralement une méthode avec un nom différent). Ainsi, en Python, vous pouvez avoir des valeurs par défaut .
Comme vous pouvez le voir, vous pouvez l' utiliser pour déclencher un comportement séparé plutôt que d'avoir simplement une valeur par défaut.
la source
None
utile lorsque vous souhaitez une valeur par défaut modifiable. Un comportement distinct devrait être dans des fonctions distinctes.None
peut également être utile comme véritable valeur par défaut.Vous ne pouvez pas, jamais besoin et ne voulez pas vraiment.
En Python, tout est un objet. Les classes sont des choses, donc ce sont des objets. Les méthodes aussi.
Il y a un objet appelé
A
qui est une classe. Il a un attribut appeléstackoverflow
. Il ne peut avoir qu'un seul de ces attributs.Lorsque vous écrivez
def stackoverflow(...): ...
, ce qui se passe, c'est que vous créez un objet qui est la méthode et que vous l'assignez à l'stackoverflow
attribut deA
. Si vous écrivez deux définitions, la seconde remplace la première, de la même manière que l'affectation se comporte toujours.De plus, vous ne voulez pas écrire de code qui fasse le plus fou des choses pour lesquelles la surcharge est parfois utilisée. Ce n'est pas ainsi que fonctionne la langue.
Au lieu d'essayer de définir une fonction distincte pour chaque type de chose qui pourrait vous être donné (ce qui n'a pas de sens puisque vous ne spécifiez pas de types pour les paramètres de fonction de toute façon), arrêtez de vous soucier de ce que sont les choses et commencez à penser à ce qu'elles peuvent faire .
Non seulement vous ne pouvez pas en écrire un distinct pour gérer un tuple par rapport à une liste, mais vous ne voulez pas ou n'en avez pas besoin .
Tout ce que vous faites est de profiter du fait qu'ils sont tous les deux, par exemple, itérables (c'est-à-dire que vous pouvez écrire
for element in container:
). (Le fait qu'ils ne soient pas directement liés par héritage n'est pas pertinent.)la source
@overload
décorateur, je dirais que "ne pas vraiment vouloir" est discutable, au mieux. D'après PEP-3124, "... c'est actuellement un anti-modèle courant pour le code Python pour inspecter les types d'arguments reçus ... la 'manière évidente' de le faire est par l'inspection de type, mais c'est fragile et fermé à extension ... "Il semble donc que suffisamment de gens le voulaient, que cela soit devenu une partie de Python.@overload
est pour la saisie uniquement.Alors que @agf avait raison avec la réponse dans le passé maintenant avec PEP-3124, nous avons obtenu notre sucre de syntaxe. Voir la documentation de frappe pour plus de détails sur le
@overload
décorateur, mais notez que ce n'est vraiment que du sucre de syntaxe et à mon humble avis, c'est tout ce que les gens se disputent depuis. Personnellement , je suis d' accord que d' avoir plusieurs fonctions avec des signatures différentes rend plus lisible ayant alors une fonction unique avec plus de 20 arguments tous ensemble à une valeur par défaut ( laNone
plupart du temps), puis avoir à bricoler en utilisant sans finif
,elif
, deselse
chaînes pour savoir ce l'appelant veut en fait que notre fonction fasse avec l'ensemble d'arguments fourni. C'était attendu depuis longtemps après le Python Zenet sans doute aussi
Directement à partir de la documentation officielle Python liée ci-dessus:
la source
@overload
fonctions ed ne sont pas censées avoir une implémentation réelle. Cela n'est pas évident d'après l'exemple de la documentation Python.J'écris ma réponse en Python 3.2.1.
Comment ça fonctionne:
overload
prend n'importe quelle quantité de callables et les stocke dans tuplefunctions
, puis retourne lambda.functions[number_of_unnamed_args_passed]
appelé avec des arguments passés au lambda.Usage:
la source
Je pense que le mot que vous recherchez est «surcharge». Il n'y a pas de surcharge de méthode en python. Vous pouvez cependant utiliser des arguments par défaut, comme suit.
Lorsque vous lui passez un argument, il suivra la logique de la première condition et exécutera la première instruction d'impression. Lorsque vous ne lui passez aucun argument, il entre dans la
else
condition et exécute la deuxième instruction d'impression.la source
J'écris ma réponse en Python 2.7:
En Python, la surcharge de méthode n'est pas possible; si vous voulez vraiment accéder à la même fonction avec des fonctionnalités différentes, je vous suggère d'opter pour le remplacement de méthode.
la source
En Python, la surcharge n'est pas un concept appliqué. Cependant, si vous essayez de créer un cas où, par exemple, vous voulez qu'un initialiseur soit exécuté si un argument de type est passé
foo
et un autre initialiseur pour un argument de typebar
alors, puisque tout en Python est traité comme objet, vous pouvez vérifier le nom du type de classe de l'objet passé et écrivez la gestion conditionnelle en fonction de cela.Ce concept peut être appliqué à plusieurs scénarios différents par différentes méthodes selon les besoins.
la source
En Python, vous feriez cela avec un argument par défaut.
la source
Je viens de tomber sur https://github.com/bintoro/overloading.py pour quiconque pourrait être intéressé.
Depuis le fichier readme du référentiel lié:
la source
Python ne prend pas en charge la surcharge de méthodes comme Java ou C ++. Nous pouvons surcharger les méthodes mais ne pouvons utiliser que la dernière méthode définie.
Nous devons fournir des arguments optionnels ou * args afin de fournir un nombre différent d'arguments lors de l'appel.
Gracieuseté de https://www.geeksforgeeks.org/python-method-overloading/
la source
Python 3.x inclut une bibliothèque de typage standard qui permet la surcharge de méthodes avec l'utilisation de @overload decorator. Malheureusement, il s'agit de rendre le code plus lisible, car les méthodes décorées @overload devront être suivies d'une méthode non décorée qui gère différents arguments. Vous pouvez en trouver plus ici ici, mais pour votre exemple:
la source
Dans le fichier MathMethod.py
Dans le fichier Main.py
Nous pouvons surcharger la méthode en utilisant multipledispatch
la source
Python a ajouté le décorateur @overload avec PEP-3124 pour fournir du sucre syntaxique pour la surcharge via l'inspection de type - au lieu de simplement travailler avec l'écrasement.
Exemple de code sur la surcharge via @overload de PEP-3124
est transformé par le @ overload-decorator en:
la source