Alternative Konstruktoren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
redbomberle
User
Beiträge: 19
Registriert: Dienstag 21. Oktober 2008, 18:28

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)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nein, Python hat so ein Konzept nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Übrigens wären Multimethods eine Alternative die in Python möglich ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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 :oops:
the more they change the more they stay the same
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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Jo stimmt, aber es funktioniert wie er es braucht
the more they change the more they stay the same
redbomberle
User
Beiträge: 19
Registriert: Dienstag 21. Oktober 2008, 18:28

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten