Ist es möglich, Funktionen in Python überladen zu haben? In C # würde ich so etwas machen
void myfunction (int first, string second)
{
//some code
}
void myfunction (int first, string second , float third)
{
//some different code
}
und wenn ich dann die Funktion aufrufe, würde sie zwischen den beiden anhand der Anzahl der Argumente unterscheiden. Ist es möglich, etwas Ähnliches in Python zu tun?
Antworten:
BEARBEITEN Die neuen generischen Funktionen für den Einzelversand in Python 3.4 finden Sie unter http://www.python.org/dev/peps/pep-0443/.
Im Allgemeinen müssen Sie Funktionen in Python nicht überladen. Python ist dynamisch typisiert und unterstützt optionale Argumente für Funktionen.
quelle
In normalem Python können Sie nicht tun, was Sie wollen. Es gibt zwei enge Annäherungen:
Wenn Sie dies jedoch wirklich tun möchten, können Sie es auf jeden Fall zum Laufen bringen (auf die Gefahr hin, die Traditionalisten zu beleidigen; o). Kurz gesagt, Sie würden eine
wrapper(*args)
Funktion schreiben , die die Anzahl der Argumente und Delegaten entsprechend überprüft. Diese Art von "Hack" wird normalerweise über Dekorateure durchgeführt. In diesem Fall könnten Sie etwas erreichen wie:und Sie würden dies implementieren, indem Sie die
overload(first_fn)
Funktion (oder den Konstruktor) dazu bringen, ein aufrufbares Objekt zurückzugeben, bei dem die__call__(*args)
Methode die oben erläuterte Delegierung ausführt und dieoverload(another_fn)
Methode zusätzliche Funktionen hinzufügt, an die delegiert werden kann.Ein Beispiel für etwas Ähnliches finden Sie hier http://acooke.org/pytyp/pytyp.spec.dispatch.html aber das überlädt Methoden nach Typ. es ist ein sehr ähnlicher Ansatz ...
UPDATE: und etwas Ähnliches (unter Verwendung von Argumenttypen) wird zu Python 3 hinzugefügt - http://www.python.org/dev/peps/pep-0443/
quelle
range
eingebaute Gerät verwendet Überlastung. Ist es also wirklich ein Hack? github.com/python/typeshed/blob/master/stdlib/2and3/…Ja es ist möglich. Ich habe den folgenden Code in Python 3.2.1 geschrieben:
Verwendung:
Beachten Sie, dass das von den
overload
Funktionen zurückgegebene Lambda die aufzurufende Funktion abhängig von der Anzahl der unbenannten Argumente auswählt.Die Lösung ist nicht perfekt, aber im Moment kann ich nichts besseres schreiben.
quelle
Nicht direkt möglich. Sie können jedoch explizite Typprüfungen für die angegebenen Argumente verwenden, obwohl dies im Allgemeinen verpönt ist.
Python ist dynamisch. Wenn Sie sich nicht sicher sind, was ein Objekt tun kann, versuchen Sie einfach: und rufen Sie eine Methode auf, außer: Fehler.
Wenn Sie nicht nach Typen, sondern nur nach Anzahl der Argumente überladen müssen, verwenden Sie Schlüsselwortargumente.
quelle
Überladungsmethoden sind in Python schwierig. Es kann jedoch sinnvoll sein, das Diktat, die Liste oder die primitiven Variablen zu übergeben.
Ich habe etwas für meine Anwendungsfälle ausprobiert. Dies könnte hier helfen, die Leute zu verstehen, die die Methoden überladen.
Nehmen wir das Beispiel, das in einem der Stackoverflow-Threads verwendet wird:
Eine Klassenüberladungsmethode mit Aufruf der Methoden aus verschiedenen Klassen.
def add_bullet(sprite=None, start=None, headto=None, spead=None, acceleration=None):
Übergeben Sie die Argumente der Remote-Klasse:
add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},accelaration=10.6}
ODER
add_bullet(sprite = 'test', start=Yes,headto={'lat':10.6666,'long':10.6666},speed=['10','20,'30']}
Daher wird die Behandlung für Listen-, Wörterbuch- oder primitive Variablen durch Überladen von Methoden erreicht.
Probieren Sie es für Ihre Codes aus
quelle