Comment puis-je utiliser la surcharge de méthode en Python?
Je suis en train de mettre en œuvre la méthode de surcharge 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 la même façon:
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 puis-je faire ce travail?
- En Python, penser à des méthodes comme un ensemble spécial de "attributs", et il ne peut qu'être un "attribut" (et donc une méthode) d'un nom à un objet. La dernière méthode remplace toutes les précédentes méthodes. En Java, les méthodes ne sont pas des citoyens de première classe (ils ne sont pas "les attributs des objets"), mais sont plutôt invoqué par "envoi de messages" qui sont statiquement réglés sur le type le plus proche (qui est l'endroit où la surcharge est livré dans).
- Voir aussi stackoverflow.com/questions/733264/...
- et stackoverflow.com/questions/6434482/python-function-overloading
- Pourquoi aucune des réponses à cette question encore été accepté? Cliquez simplement sur le outlied coche sur la gauche de votre favori de réponse...
- double possible de les fonctions Surchargées en python?
- essayez de lire learnbatta.com/blog/method-overloading-in-python-60
Vous devez vous connecter pour publier un commentaire.
C'est la méthode surcharge pas de méthode primordial. Et en Python, vous faire tout cela en une seule fonction:
Vous ne pouvez pas avoir les deux méthodes avec le même nom en Python -- et vous n'avez pas besoin d'.
Voir le Valeur Par Défaut Des Arguments section du tutoriel Python. Voir "Moins d'Étonnement" et de la Mutable Argument par Défaut pour une erreur commune à éviter.
Modifier: Voir PEP 443 pour plus d'informations sur le nouveau single de répartition des fonctions génériques en Python 3.4.
if:
,elif:
sur différents arguments passés à la "seul envoi de la fonction générique' dire si nous avons besoin de plusieurs surcharges qui effectuer différentes actions basées sur les différentes ensemble d'arguments?if
s à faire l'expédition sur un seul argument à la PEP 443 fonctions génériques. Veuillez lire le document lié.Velocity()
, ce qui représente une vitesse de zéro, etVelocity(x,y,z)
. Dans ce cadre, le rendant exigible commeVelocity(1,3)
n'a pas de sens. De même,Position(x,y,z)
vsPosition(position)
.En Python, tu ne fais pas les choses de cette façon. Quand les gens ne font que dans des langages comme Java, ils veulent généralement une valeur par défaut (si ils ne le font pas, ils veulent généralement une méthode avec un nom différent). Donc, en Python, vous pouvez avoir des valeurs par défaut.
Comme vous pouvez le voir, vous peut l'utiliser pour déclencher comportement séparé plutôt que de simplement avoir une valeur par défaut.
None
est utile lorsque vous souhaitez une mutable valeur par défaut. Comportement distinct doit être dans des fonctions séparées.Vous pouvez également utiliser pythonlangutil:
Edit: Avec le soutien officiel de la Surcharge en Python 3, vous pouvez utiliser @surcharge décorateur.
Vous ne pouvez pas, jamais besoin de et ne veulent pas vraiment.
En Python, tout est objet. Les Classes sont des choses, de sorte qu'ils sont des objets. Sont donc des méthodes.
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 de l'attribuer à l'stackoverflow
attribut deA
. Si vous écrivez deux définitions, le second remplace le premier, de la même manière que la cession se comporte toujours.En outre, vous ne voulez pas écrire du code qui fait le plus sauvage de la sortes de choses que la surcharge est parfois utilisé pour. Ce n'est pas comment la langue fonctionne.
Au lieu d'essayer de définir une fonction distincte pour chaque type de chose que vous pourriez être donné (qui n'a guère de sens puisque vous n'avez pas à spécifier les types de paramètres de la fonction, de toute façon), cesser de s'inquiéter de ce que les choses sont et commencer à réfléchir sur ce qu'ils peuvent ne.
Non seulement vous ne pouvez pas écrire un document séparé pour gérer un tuple vs une liste, mais aussi ne voulez pas ou besoin de.
Tout ce que vous faire est de profiter du fait qu'ils sont à la fois, par exemple, itérable (c'est à dire que vous pouvez écrire
for element in container:
). (Le fait qu'ils ne sont pas directement liés par l'héritage est pertinent.)@overload
décorateur, je dirais que "ne veulent pas vraiment" est contestable, au mieux. À partir du PEP-3124, "...il est actuellement l'un des courants anti-modèle pour le code Python pour inspecter les types d'arguments...les "évident" de le faire est par le type d'inspection, mais c'est fragile et fermé à l'extension..." il semble Donc que si suffisamment de gens voulaient, qu'il est devenu une partie de Python.@overload
est pour taper seulement.J'écris ma réponse en Python 3.2.1.
Comment cela fonctionne:
overload
prend tout montant de callables et les stocke dans un tuplefunctions
, puis retourne lambda.puis retourne le résultat de l'appel de fonction stockée dans
functions[number_of_unnamed_args_passed]
appelée avec des arguments passés à la lambda.Utilisation:
Je pense que le mot que vous cherchez est "surcharge". Il n'y a pas de surcharge de la méthode en python. Vous pouvez cependant utiliser des arguments par défaut, comme suit.
Lorsque vous passez un argument, il suivra la logique de la première condition et exécuter la première instruction print. Lorsque vous le passez pas d'arguments, il va aller dans le
else
état et exécuter la deuxième instruction print.J'écris ma réponse en Python 2.7:
En Python, la surcharge de méthode n'est pas possible, si vraiment vous voulez accéder à la même fonction avec des caractéristiques différentes, je vous suggère de passer par la redéfinition de méthode.
En Python, la surcharge n'est pas un concept appliqué. Toutefois, si vous essayez de créer un cas où, par exemple, vous voulez un initialiseur être effectuée si elle est adoptée un argument de type
foo
et un autre d'initialiseur pour un argument de typebar
alors, puisque tout ce qui est en Python est traité comme un objet, vous pouvez vérifier le nom de l'objet passé en classe du type et de l'écriture conditionnelle de manutention sur cette base.Ce concept peut être appliqué à plusieurs scénarios différents à travers différentes méthodes que nécessaire.
En Python, vous devrez faire cela avec un argument par défaut.
Viens de tomber sur ce https://github.com/bintoro/overloading.py pour quelqu'un qui peut être intéressé.
À partir du référentiel lié readme:
Tandis que @agf a droit à la réponse dans le passé maintenant, avec PEP-3124 nous avons eu notre syntaxe sugger. Voir en tapant la documentation pour plus de détails sur le
@overload
décorateur mais note que c'est vraiment juste la syntaxe sugger et à mon avis c'est tout, les gens se disputer à ce sujet depuis. Personnellement, je suis d'accord que le fait d'avoir de multiples fonctions avec différentes signatures rend plus lisible que d'avoir une seule fonction avec 20+ arguments tous ensemble pour une valeur par défaut (None
la plupart du temps) et puis d'avoir à bricoler à l'aide d'interminablesif
,elif
,else
chaînes de savoir ce que l'appelant veut vraiment que notre fonction pour faire avec la série d'arguments. Cela, il est plus que temps suivant le Python Zenet sans doute aussi
Directement à partir de l'officiel de la documentation Python lié ci-dessus:
Python ne prend pas en charge la surcharge de méthode comme le Java ou le C++. On peut surcharger les méthodes, mais ne peut utiliser la dernière méthode définie.
Nous avons besoin de fournir des arguments optionnels ou *args, afin de fournir un nombre différent de args sur appel.
Courtoisie de la part de https://www.geeksforgeeks.org/python-method-overloading/
Python 3.x intègre en standard de frappe de la bibliothèque qui permet pour la surcharge de méthode avec l'utilisation de @surcharge de décorateur. Malheureusement, c'est pour rendre le code plus lisible, comme l' @surcharge décorées méthodes devront être suivies par un non-décoré de la méthode qui gère les différents arguments.
Plus peut être trouvé ici ici mais pour ton exemple:
Dans MathMethod.py fichier
Dans Main.py fichier
On peut surcharger une méthode en utilisant multipledispatch