Heim  >  Artikel  >  Backend-Entwicklung  >  Wenn das Überladen von Methoden in Python nicht funktioniert?

Wenn das Überladen von Methoden in Python nicht funktioniert?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-23 00:01:03473Durchsuche

When Method Overloading Doesn't Work in Python?

Methodenüberladung in Python

In Python ist Methodenüberladung die Möglichkeit, mehrere Methoden mit demselben Namen, aber unterschiedlichen Parametern zu definieren. Dies kann jedoch zu unerwartetem Verhalten führen.

Beispiel 1:

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

Wenn Sie die Methode mit einem Argument aufrufen, wird die zweite Methode aufgerufen:

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

Aber wenn Sie es ohne Argument aufrufen, gibt Python einen Fehler aus:

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

Dies liegt daran, dass Python davon ausgeht, dass die erste Methode keine Argumente und kein Standardargument hat .

Lösung:

Um dieses Problem zu lösen, können Sie Standardparameterwerte verwenden:

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

Jetzt funktionieren beide Aufrufe:

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

Erweitertes Überladen mit Single Dispatch

Python 3.4 führte generische Single-Dispatch-Funktionen ein, mit denen Sie spezifische Verhaltensweisen für verschiedene Argumenttypen definieren können:

<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>

Dadurch können Sie mit verschiedenen Argumenttypen Spaß machen und das entsprechende Verhalten erzielen:

<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>

Das obige ist der detaillierte Inhalt vonWenn das Überladen von Methoden in Python nicht funktioniert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn