Wenn das Überladen von Methoden in Python nicht funktioniert?

Patricia Arquette
Freigeben: 2024-10-23 00:01:03
Original
472 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Jetzt funktionieren beide Aufrufe:

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

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!