Wie überladen Sie die Methode __init__ basierend auf dem Argumenttyp?
Sagen wir, ich habe eine Klasse, die hat ein Mitglied namens data, das ist eine Liste.
Ich möchte in der Lage sein, die zum initialisieren der Klasse mit, zum Beispiel einen Dateinamen (enthält Daten, die zum initialisieren der Liste) oder eine aktuelle Liste.
Was ist Eure Technik, dies zu tun?
Tun Sie überprüfen Sie einfach die Art von Blick auf __class__
?
Gibt es irgendein trick, den ich möglicherweise fehlen?
Bin ich auf C++, wo eine überlastung durch den argument-Typ ist einfach.
InformationsquelleAutor der Frage Baltimark | 2008-09-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen viel ordentlicher Weg, um 'Alternative Konstrukteurs-ist die Verwendung classmethods. Zum Beispiel:
Dem Grund ist es einfach besser ist, dass es keinen Zweifel daran, welche Typ erwartet wird, und Sie sind nicht gezwungen, zu erraten, was der Anrufer für Sie bestimmt zu tun, der Datentyp, der es Ihnen gab. Das problem mit
isinstance(x, basestring)
ist, dass es keine Möglichkeit für den Anrufer, Ihnen zu sagen, zum Beispiel, dass, obwohl der Typ nicht einen basestring, behandeln Sie es als string (und nicht eine andere Reihenfolge.) Und vielleicht ist der Anrufer möchte den gleichen Typ zu verwenden für verschiedene Zwecke, die manchmal aus einem einzigen Element, und manchmal als eine Sequenz von Elementen. Als explizite nimmt alle Zweifel Weg und führt zu robuster und übersichtlicher code.InformationsquelleAutor der Antwort Thomas Wouters
Ausgezeichnete Frage. Ich habe dieses problem angegangen, und während ich Zustimmen, dass "Fabriken" (Klassen-Methode-Konstruktoren) sind eine gute Methode, die ich vorschlagen möchte, eine andere, die hab ich auch gefunden, sehr nützlich:
Hier ist ein Beispiel (dies ist ein
read
Methode und nicht Konstruktor, aber die Idee ist die gleiche):Die zentrale Idee hier ist, mit Python ist eine hervorragende Unterstützung für benannte Argumente um dies zu implementieren. Nun, wenn ich Lesen möchte die Daten aus einer Datei, ich sage:
Und Lesen aus einem string, sage ich:
Diese Weise hat der Benutzer nur eine einzige Methode zu nennen. Handhabung im inneren, als Sie sah, ist nicht übermäßig Komplex
InformationsquelleAutor der Antwort Eli Bendersky
Bessere Weg wäre, um isinstance und Typ-Umwandlung. Wenn ich bin, verstehen Sie Recht, Sie wollen diese:
InformationsquelleAutor der Antwort John Millikin
Quick-and-dirty fix
Dann rufen Sie es mit
InformationsquelleAutor der Antwort Ben
Sollten Sie verwenden isinstance
InformationsquelleAutor der Antwort Moe
mit Python ist3, die Sie verwenden können, Die Umsetzung von Multiple Dispatch mit der Funktion Anmerkungen als Python-Kochbuch schrieb:
und es funktioniert wie:
InformationsquelleAutor der Antwort carton.swing
Möchten Sie wahrscheinlich die
isinstance
builtin-Funktion:InformationsquelleAutor der Antwort Eli Courtwright
Meine bevorzugte Lösung ist:
Dann rufen Sie ihn entweder über
MyClass()
oderMyClass([1,2,3])
.Hoffe, das hilft. Happy Coding!
InformationsquelleAutor der Antwort Fydo
OK, Super. Ich habe gerade geworfen zusammen in diesem Beispiel wird mit einem Tupel, die nicht mit dem Namen, aber das ist einfach. Vielen Dank an alle.
a = [1,2]
b = (2,3)
c = MyData(a)
d = MyData(b)
c.GetData()
d.GetData()
[1, 2]
[2, 3]
InformationsquelleAutor der Antwort Baltimark
Warum gehen Sie nicht noch mehr pythonic?
InformationsquelleAutor der Antwort