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

Patricia Arquette
Libérer: 2024-10-23 00:01:03
original
471 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

Maintenant, les deux appels fonctionneront :

<code class="python">ob=A()
ob.stackoverflow(2)
# Output: only method
ob.stackoverflow()
# Output: only method</code>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!