Maison >développement back-end >Tutoriel Python >Quand la surcharge de méthodes ne fonctionne pas en Python ?

Quand la surcharge de méthodes ne fonctionne pas en Python ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-23 00:01:03547parcourir

When Method Overloading Doesn't Work in Python?

Surcharge de méthodes en Python

En Python, la surcharge de méthodes est la possibilité de définir plusieurs méthodes avec le même nom mais des paramètres différents. Cependant, cela peut conduire à un comportement inattendu.

Exemple 1 :

<code class="python">class A:
    def stackoverflow(self):    
        print ('first method')
    def stackoverflow(self, i):
        print ('second method', i)</code>

Si vous appelez la méthode avec un argument, la deuxième méthode sera invoquée :

<code class="python">ob=A()
ob.stackoverflow(2)
# Output: second method 2</code>

Mais si vous l'appelez sans argument, Python générera une erreur :

<code class="python">ob=A()
ob.stackoverflow()
# Output: TypeError: stackoverflow() takes exactly 2 arguments (1 given)</code>

C'est parce que Python considère la première méthode comme n'ayant aucun argument, pas un argument par défaut .

Solution :

Pour résoudre ce problème, vous pouvez utiliser les valeurs de paramètres par défaut :

<code class="python">class A:
    def stackoverflow(self, i='some_default_value'):
        print('only method')</code>

Maintenant, les deux appels fonctionneront :

<code class="python">ob=A()
ob.stackoverflow(2)
# Output: only method
ob.stackoverflow()
# Output: only method</code>

Surcharge avancée avec répartition unique

Python 3.4 a introduit des fonctions génériques de répartition unique, qui vous permettent de définir des comportements spécifiques pour différents types d'arguments :

<code class="python">from functools import singledispatch

@singledispatch
def fun(arg, verbose=False):
    if verbose:
        print(&quot;Let me just say,&quot;, end=&quot; &quot;)
    print(arg)

@fun.register(int)
def _(arg, verbose=False):
    if verbose:
        print(&quot;Strength in numbers, eh?&quot;, end=&quot; &quot;)
    print(arg)

@fun.register(list)
def _(arg, verbose=False):
    if verbose:
        print(&quot;Enumerate this:&quot;)
    for i, elem in enumerate(arg):
        print(i, elem)</code>

Cela vous permet d'appeler fun avec différents types d'arguments et d'obtenir le comportement approprié :

<code class="python">fun(42)
# Output: Strength in numbers, eh? 42
fun([1, 2, 3])
# Output: Enumerate this:
# 0 1
# 1 2
# 2 3</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn