Seite 1 von 1
Alternative Konstruktoren
Verfasst: Montag 26. Oktober 2009, 12:41
von redbomberle
Hi zusammen ich habe eine Frage zu "Konstruktoren".
ich möchte eine Objekt configuration initialiseren und möchte zwei verschiedene Konstruktoren:
1.
Code: Alles auswählen
def configuration():
window_size_detection=100000
offset_detection=20000
window_size_spike=45001
...
return config
und 2.
Code: Alles auswählen
def configuration(wsd, od, wss):
window_size_detection=wsd
offset_detection=od
window_size_spike=wss
...
return config
Nun meldet mein compiler aber immer den Fehler, dass configuration() 3 Attribute benötigt, dabei möchte ich in diesem Fall dass natürlich der erste Konstruktor aufgerufen wird.
Nun meine Frage:
Worin liegt der Fehler? Gibt es alternative Kontruktoren in Python?
(ps.: komme aus der java-welt)
Verfasst: Montag 26. Oktober 2009, 12:53
von Leonidas
Nein, Python hat so ein Konzept nicht.
Re: Alternative Konstruktoren
Verfasst: Montag 26. Oktober 2009, 12:57
von Hyperion
Das Wort Konstruktoren kenne ich nur im Zusammenhang mit Klassen. Du zeigst hier aber nur zwei Funtkionen (deren namen auch nicht wirklich glücklich gewählt sind imho).
Die später deklarierte Funktion überschreibt einfach die bisher vorhandene:
Code: Alles auswählen
In [9]: def foo():
...: print "foo() ohne alles"
...:
...:
In [10]: def foo(test):
....: print "foo() mit parameter:", test
....:
....:
In [11]: foo()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/nelson/bin/<ipython console> in <module>()
TypeError: foo() takes exactly 1 argument (0 given)
In [12]: foo("Test")
foo() mit parameter: Test
Bei __init__() Methoden (imho das Konstruktor-Konzept in Python) wäre das Verhalten äquivalent.
Du kannst das Dilemma aber einfach lösen: Gib default Parameter an!
Code: Alles auswählen
def foo(param1, param2="Test"):
print "param1", param1
print "param2", param2
foo("Hallo Welt")
foo(123, 456)
Verfasst: Montag 26. Oktober 2009, 12:58
von Leonidas
Übrigens wären Multimethods eine Alternative die in Python möglich ist.
Re: Alternative Konstruktoren
Verfasst: Montag 26. Oktober 2009, 13:04
von Dav1d
Klar geht das:
Code: Alles auswählen
def configuration(wsd = 100000, od = 20000, wss=45001):
window_size_detection=wsd
offset_detection=od
window_size_spike=wss
...
return config
wenn kein parameteer übergeben wird, werden einfach die Standard-Werte genommen
//Edit: hab Standard mit t geschrieben

Verfasst: Montag 26. Oktober 2009, 13:21
von lunar
Nein, "das" (nämlich Funktionsüberladung bzw. Methodenüberladung im Sinne statisch typisierter Sprachen) geht in Python nicht. Standardargumente sind etwas anderes und bildet auch nur einen Teil der Möglichkeiten von überladenen Funktion ab (nämlich eben Standardargumente). Verschiedene Typen für bestimmte Argumente lassen sich mit Standardargumenten nicht realisieren, dafür muss man in der Funktion selbst Typen testen.
Verfasst: Montag 26. Oktober 2009, 13:59
von Dav1d
Jo stimmt, aber es funktioniert wie er es braucht
Verfasst: Montag 26. Oktober 2009, 14:44
von redbomberle
also klar, war mein Fehler...hierbei handelt es sich um keine Konstruktoren.
Ich habe nun nur noch eine Methode mit Standardargumenten.
Die Möglichkeit mit den Multimethods wäre vermutlich auch eine Lösung.
Aber doch nur wenn dieselbe Anzahl an Argumenten übergeben wird oder?
Verfasst: Montag 26. Oktober 2009, 15:22
von Leonidas
redbomberle hat geschrieben:Die Möglichkeit mit den Multimethods wäre vermutlich auch eine Lösung.
Aber doch nur wenn dieselbe Anzahl an Argumenten übergeben wird oder?
Nein, wieso? Prinzipiell ist es egal auf was du dispatcht, ob das nun die Typen von Parametern sind, die Werte dieser Parameter oder die Anzahl der Parameter.