Ich versuche, Methodenüberladung in Python zu implementieren:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow(2)
aber die Ausgabe ist second method 2
; ähnlich:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow()
gibt
Traceback (most recent call last):
File "my.py", line 9, in <module>
ob.stackoverflow()
TypeError: stackoverflow() takes exactly 2 arguments (1 given)
Wie mache ich das?
python
class
overloading
user1335578
quelle
quelle
Antworten:
Es Methode Überlastung nicht Methode überschrieben . Und in Python erledigen Sie alles in einer Funktion:
Sie können in Python nicht zwei Methoden mit demselben Namen haben - und das müssen Sie auch nicht.
Weitere Informationen finden Sie im Abschnitt Standardargumentwerte des Python-Lernprogramms. Unter "Wenig Erstaunen" und dem Argument "Veränderbarer Standard" finden Sie einen häufigen Fehler, den Sie vermeiden sollten.
Bearbeiten : Informationen zu den neuen generischen Einzelversandfunktionen in Python 3.4 finden Sie in PEP 443 .
quelle
Sie können auch Pythonlangutil verwenden :
quelle
In Python machen Sie die Dinge nicht so. Wenn Benutzer dies in Sprachen wie Java tun, möchten sie im Allgemeinen einen Standardwert (wenn nicht, möchten sie im Allgemeinen eine Methode mit einem anderen Namen). In Python können Sie also Standardwerte haben .
Wie Sie sehen, können Sie dies verwenden, um ein separates Verhalten auszulösen, anstatt nur einen Standardwert zu haben.
quelle
None
ist es nützlich, wenn Sie einen veränderlichen Standardwert wünschen. Separates Verhalten sollte in separaten Funktionen erfolgen.None
kann auch als echter Standardwert nützlich sein.Sie können, müssen und wollen nicht wirklich.
In Python ist alles ein Objekt. Klassen sind Dinge, also Objekte. Methoden sind es auch.
Es gibt ein Objekt namens,
A
das eine Klasse ist. Es hat ein Attribut namensstackoverflow
. Es kann nur ein solches Attribut haben.Wenn Sie schreiben
def stackoverflow(...): ...
, erstellen Sie ein Objekt, das die Methode ist, und weisen es demstackoverflow
Attribut von zuA
. Wenn Sie zwei Definitionen schreiben, ersetzt die zweite die erste, so wie sich die Zuweisung immer verhält.Sie möchten außerdem keinen Code schreiben, der die wilderen Dinge tut, für die Überladung manchmal verwendet wird. So funktioniert die Sprache nicht.
Anstatt zu versuchen, eine separate Funktion für jeden Typ von Dingen zu definieren, die Ihnen gegeben werden könnten (was wenig Sinn macht, da Sie ohnehin keine Typen für Funktionsparameter angeben), machen Gedanken mehr darüber, was Dinge sind, und überlegen Sie, was sie tun können .
Sie können nicht nur kein separates schreiben, um ein Tupel gegen eine Liste zu verarbeiten, sondern möchten oder müssen es auch nicht .
Alles, was Sie tun, ist die Tatsache auszunutzen, dass beide beispielsweise iterierbar sind (dh Sie können schreiben
for element in container:
). (Die Tatsache, dass sie nicht direkt durch Vererbung verbunden sind, ist irrelevant.)quelle
@overload
Dekorateurs würde ich sagen, dass "nicht wirklich wollen" bestenfalls fraglich ist. Aus PEP-3124 geht hervor, dass "... es derzeit ein gängiges Anti-Pattern für Python-Code ist, die Typen empfangener Argumente zu überprüfen ... der 'offensichtliche Weg', dies zu tun, ist die Typprüfung, aber dies ist spröde und verschlossen Erweiterung ... "Es scheint also, als wollten genug Leute, dass es Teil von Python wurde.@overload
ist nur für die Eingabe.Während @agf mit PEP-3124 in der Vergangenheit mit der Antwort Recht hatte, haben wir unseren Syntaxzucker erhalten. Weitere Informationen zum
@overload
Dekorateur finden Sie in der Schreibdokumentation. Beachten Sie jedoch, dass dies wirklich nur Syntaxzucker ist. IMHO ist dies alles, worüber sich die Leute seitdem gestritten haben. Persönlich stimme ich , dass mit unterschiedlichen Signaturen mehr Funktionen haben , macht es besser lesbar dann mit 20+ Argumenten alle auf einen Standardwert eine einzige Funktion ( dieNone
meiste Zeit) und dann endlos mit herumzudaddeln mitif
,elif
,else
Ketten , um herauszufinden , was Der Aufrufer möchte tatsächlich, dass unsere Funktion mit den bereitgestellten Argumenten zu tun hat. Dies war nach dem Python Zen längst überfälligund wohl auch
Direkt aus der oben verlinkten offiziellen Python-Dokumentation:
quelle
@overload
ed-Funktionen sollten keine tatsächliche Implementierung haben. Dies ist aus dem Beispiel in der Python-Dokumentation nicht ersichtlich.Ich schreibe meine Antwort in Python 3.2.1.
Wie es funktioniert:
overload
Nimmt eine beliebige Anzahl von Callables, speichert sie in Tupelfunctions
und gibt dann Lambda zurück.functions[number_of_unnamed_args_passed]
aufgerufenen Argumenten gespeichert ist, die an das Lambda übergeben wurden.Verwendung:
quelle
Ich denke, das Wort, das Sie suchen, ist "Überladung". In Python gibt es keine Methodenüberladung. Sie können jedoch die folgenden Standardargumente verwenden.
Wenn Sie ein Argument übergeben, folgt es der Logik der ersten Bedingung und führt die erste print-Anweisung aus. Wenn Sie keine Argumente übergeben, geht es in die
else
Bedingung und führt die zweite print-Anweisung aus.quelle
Ich schreibe meine Antwort in Python 2.7:
In Python ist eine Methodenüberladung nicht möglich. Wenn Sie wirklich auf dieselbe Funktion mit unterschiedlichen Funktionen zugreifen möchten, empfehlen wir Ihnen, die Methode zu überschreiben.
quelle
In Python ist das Überladen kein angewandtes Konzept. Wenn Sie jedoch versuchen, einen Fall zu erstellen, in dem beispielsweise ein Initialisierer ausgeführt werden soll, wenn ein Argument vom Typ übergeben wird,
foo
und ein anderer Initialisierer für ein Argument vom Typbar
, können Sie dies überprüfen, da alles in Python als Objekt behandelt wird den Namen des Klassentyps des übergebenen Objekts und die darauf basierende bedingte Schreibbehandlung.Dieses Konzept kann je nach Bedarf mit verschiedenen Methoden auf mehrere verschiedene Szenarien angewendet werden.
quelle
In Python würden Sie dies mit einem Standardargument tun.
quelle
Bin gerade auf diese https://github.com/bintoro/overloading.py gestoßen gestoßen, für alle, die interessiert sein könnten.
Aus der Readme-Datei des verknüpften Repositorys:
quelle
Python unterstützt keine Methodenüberladung wie Java oder C ++. Wir können die Methoden überladen, aber nur die zuletzt definierte Methode verwenden.
Wir müssen optionale Argumente oder * Argumente angeben, um beim Aufrufen eine andere Anzahl von Argumenten bereitzustellen.
Mit freundlicher Genehmigung von https://www.geeksforgeeks.org/python-method-overloading/
quelle
Python 3.x enthält eine Standard-Typisierungsbibliothek, die das Überladen von Methoden mithilfe von @overload decorator ermöglicht. Leider dient dies dazu, den Code besser lesbar zu machen, da auf die mit @overload dekorierten Methoden eine nicht dekorierte Methode folgen muss, die verschiedene Argumente verarbeitet. Mehr finden Sie hier , aber für Ihr Beispiel:
quelle
In der Datei MathMethod.py
In der Datei Main.py.
Wir können die Methode mit Multipledispatch überladen
quelle
Python hat den @ overload Decorator mit hinzugefügt PEP-3124 , um syntaktischen Zucker zum Überladen über die Typprüfung bereitzustellen - anstatt nur mit dem Überschreiben zu arbeiten.
Codebeispiel zum Überladen über @overload von PEP-3124
wird vom @ overload-decorator in Folgendes umgewandelt:
quelle