überladen von Methoden in python
Muss ich anrufen unparameterised Methode first
, aber auch parametrisierte first
, aber es gibt einen Fehler.
>>> class A:
... def first(self):
... print 'first method'
... def first(self,f):
... print 'first met',f
...
>>> a=A()
>>> a.first()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: first() takes exactly 2 arguments (1 given)
Ist es möglich, die Methode überladen in Python wie in Java?
- Bitte erbt von dem Objekt! Sie wollen nicht wirklich ein old-style Klasse, und du? (Dies wäre ein nicht-Problem in Python 3, aber Ihre print-Anweisungen, Sag mir, dass du mit Python 2.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre zweite
first
Methode ist das überschreiben der original -first
Methode. In Python ist es nicht möglich zu erstellen überladenen Methoden auf die gleiche Weise wie in Java.Allerdings können Sie erstellen Methoden mit optionalen und/oder keyword-basierte Argumente und verarbeiten diese entsprechend. Hier ist ein Beispiel:
Verwendung:
Python nicht überladen von Funktionen. Dies ist eine Folge davon ist eine lose typisierte Sprache. Stattdessen können Sie angeben, dass eine unbekannte Anzahl von Argumenten und der Umgang mit Ihrer interpretation in der Funktion der Logik.
Gibt es ein paar Möglichkeiten, wie Sie dies tun können. Sie können angeben, bestimmte optionale Argumente:
Aufruf erhalten wir:
Oder Sie können angeben, dass eine unbekannte Anzahl von Unbenannte Argumente (d.h. die übergebenen Argumente in einem array):
Aufruf erhalten wir:
Oder Sie können angeben, dass eine unbekannte Anzahl von benannten Argumenten (d.h. die übergebenen Argumente in ein dictionary):
Aufruf erhalten wir:
Können Sie diese Konstruktionen zu produzieren, die das Verhalten, die Sie waren auf der Suche nach einer überlastung.
func1()
verhält sich nicht wie ein namens erwarten könnte, wenn es aufgerufen wird alsfunc1(1, 0)
In der Regel können Sie nur definieren Sie eine Methode in einer Klasse mit einem bestimmten Namen. In deinem Beispiel das 2 argument zuerst () - Methode überschrieben haben, das 1-argument der ersten(). Wenn Sie zwei Methoden mit dem gleichen Namen, in python 3 verwenden Sie die functools.singledispatch, und ordnen Sie die Instanz name der Methode auf Ihre statische Methode dispatcher, AUA!
Sagte, dass ich wirklich wie implizite dynamic dispatch in OO-Programmierung, und ich finde es sauberer als schreibt dispatch-Logik in einer Art 'master' first () - Funktion, die monoton ist und spröde Erweiterung.
Frage: fügen Sie eine andere Methode wie A. first(arg).
Wahrscheinlich werden Sie eine Menge lernen über die python-Typ-system, wenn Sie versuchen, dies zu tun!
Python ist nicht C++ oder Java; Sie können nicht überladen Methoden in der gleichen Weise.
Wirklich, der einzige Weg, das zu tun, was Sie wollen, ist der test für das Vorhandensein oder fehlen des zweiten Parameters:
Können Sie noch mehr anspruchsvolle und überprüfen Sie die Art des
f
aber das kann gefährlich sein, und nicht immer ist "pythonic". (Es sollte jedoch erwähnt werden, dass ein Anwendungsfall für Funktion Anmerkungen in Python 3 ist es, diese Art der "Generische Programmierung".)Während es möglich ist, ein system zu schaffen, das angezeigt wird, um überladene Methoden, es ist ein wenig beteiligt, und in der Regel nicht erforderlich.
Das übliche idiom ist, um eventuell nicht benötigte Parameter standardmäßig auf
None
etwa so:In Ihrem Fall, wo Sie wollen, Verhalten sich anders, je nachdem, ob oder nicht ist dies der erste Aufruf der Methode, das ist, was ich tun würde:
und Beispiel-Ausgabe:
Drucke:
Überprüfen Sie diesen code, wenn es hilfreich ist: