
Hallo, wie ich gerade mit Entsetzen feststellen musste, kann man in Python gar keine Methoden überladen! Wie umgeht man diese Schwäche am elegantesten? Übergebt ihr einfach None, wenn ein Parameter leer ist? Bei normalen Methoden könnte man ja noch auf zwei Methoden mit unterschiedlichen Namen ausweichen, aber spätestens bei einem Constructor geht das nicht mehr. Gruß Christian -- DSL Komplett von GMX +++ Supergünstig und stressfrei einsteigen! AKTION "Kein Einrichtungspreis" nutzen: http://www.gmx.net/de/go/dsl _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

--On Mittwoch, 16. Februar 2005 19:47 Uhr +0100 Christian Helmbold <c.helmbold@gmx.de> wrote:
Hallo,
wie ich gerade mit Entsetzen feststellen musste, kann man in Python gar keine Methoden überladen! Wie umgeht man diese Schwäche am elegantesten?
Methoden überladen (gleicher Methodenname aber unterschiedliche Signatur) geht glaube ich bei keiner Skriptsprache. Wie sollte es bei Python auch gehen, wenn Du siehst wie Python mit variablen Parameterlisten arbeitet/arbeiten kann. Selbst als Programmierer mit C++ Erfahrung habe bis jetzt nach 10 Jahren noch nie den Bedarf nach Überladung in Python gehabt. -aj _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Christian Helmbold wrote:
wie ich gerade mit Entsetzen feststellen musste, kann man in Python gar keine Methoden überladen! Wie umgeht man diese Schwäche am elegantesten?
Du meinst überschreiben mit einer Methode gleichen Namens aber unterscheidlicher Signatur? Das ist bei Python nicht nötig.
Übergebt ihr einfach None, wenn ein Parameter leer ist? Bei normalen
Nein, man verwendet sinnvollerwiese Keyword-Arguments und Default-Parameter, etwa so: def methode1(self, arg1, arg2, arg3=42, arg4=None, arg5='ich-du-er-sie-es') und dann: abc.methogde1('lalla', 105) abc.methogde1('lalla', 105, arg5='meins-deins-ihres') abc.methogde1('lalla', 105, 9999, zfb, 'nix') -- Schönen Gruß - Regards Hartmut Goebel | Hartmut Goebel | IT-Security -- effizient | | h.goebel@goebel-consult.de | www.goebel-consult.de | _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

wie ich gerade mit Entsetzen feststellen musste, kann man in Python gar keine Methoden überladen! Wie umgeht man diese Schwäche am elegantesten?
Schwäche? Also, ich brauch das bei Python nie... da es keine Typsicherheit gibt, wohl auch besser so. Wenn man es _wirklich_ mal benötigt (also wohl eher nie, siehe auch die anderen Antworten), könnte man z.B. der Methode als Argument eine Liste oder einen Tupel übergeben, und anschließend mit "if...elif...else" abfragen was für eine Liste/Tupel das ist bzw. was sie enthält, und dann entsprechend behandeln: def tralala(liste): if len(liste)==4: ... elif len(liste)>2 and type(liste[2])==type(1): ... Nicht sehr schön, aber wer das unbedingt braucht... Ciao, Mirko _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

"Christian" == Christian Helmbold <c.helmbold@gmx.de> writes:
Christian> wie ich gerade mit Entsetzen feststellen musste, kann Christian> man in Python gar keine Methoden überladen! Wie umgeht Christian> man diese Schwäche am elegantesten? Übergebt ihr Christian> einfach None, wenn ein Parameter leer ist? Bei normalen Christian> Methoden könnte man ja noch auf zwei Methoden mit Christian> unterschiedlichen Namen ausweichen, aber spätestens bei Christian> einem Constructor geht das nicht mehr. Ja, das ist wirklich ganz entsetzlich, nicht wahr? In meinen Augen ist das ist gleich nach dem Unfug mit der Einrückung anstatt von geschweiften Klammern, die sich nun wirklich in Milliarden von Code als bewährt herausgestellt haben, die größte Schwäche von Python. Naja, oder wenigstens nach dem Fehlen von strikter Typisierung, und generischen Typen die man damit braucht. Und vielleicht noch dem Fehlen eines semantisch von dem Rest der Sprache abweichenden Compile-time Berechnungsmodell (wie es C++ ja z.B. sehr erfolgreich mit den Templates einsetzt; Templates können nur Gurus, bei Python kann jeder Hinz und Kunz so etwas; da ist es kein Wunder daß C++-Programmierer so viel besser bezahlt werden). Lass Dich nicht von den anderen ablenken. Nur weil man das in der Praxis nicht braucht, heißt das ja noch lange nicht daß es in der Theorie auch funktioniert. Gottseidank gibt es ja eine Lösung. Sie Dir doch mal die generischen Funktionen an: http://dirtsimple.org/2004/11/generic-functions-have-landed.html Das ist eine tolle Sache. Damit kann man zwar auch sinnvolle Dinge machen aber man kann das auch (wie Überladen) dazu gebrauchen, daß man am Ende nicht mehr weiß, was passiert. Holger _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

On 16.Feb 2005 - 19:47:54, Christian Helmbold wrote:
wie ich gerade mit Entsetzen feststellen musste, kann man in Python gar keine Methoden überladen! Wie umgeht man diese Schwäche am elegantesten? Übergebt ihr einfach None, wenn ein Parameter leer ist? Bei normalen Methoden könnte man ja noch auf zwei Methoden mit unterschiedlichen Namen ausweichen,
Neben den anderen Antworten, die alle korrekt sind, möchte ich dich noch auf etwas hinweisen (was auch ich erst nach einiger Zeit mit Python mitbekommen habe):
aber spätestens bei einem Constructor geht das nicht mehr.
Es gibt keine Konstruktoren in Python, die __init__ Methode ist kein Konstruktor, sondern sie erzeugt z.B. Instanzvariablen. Ein Konstruktor in C++ oder Java ist etwas das aus dem Nichts eine Instanz erzeugt, wie man aber an der Signatur von _init__ sehen kann ( __init__(*self*): ) existiert die Instanz beim Aufruf der Funktion schon. Andreas -- Bank error in your favor. Collect $200. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Andreas Pakulat <apaku@gmx.de> wrote:
On 16.Feb 2005 - 19:47:54, Christian Helmbold wrote:
wie ich gerade mit Entsetzen feststellen musste, kann man in Python gar keine Methoden überladen! Wie umgeht man diese Schwäche am elegantesten? Übergebt ihr einfach None, wenn ein Parameter leer ist? Bei normalen Methoden könnte man ja noch auf zwei Methoden mit unterschiedlichen Namen ausweichen,
Neben den anderen Antworten, die alle korrekt sind, möchte ich dich noch auf etwas hinweisen (was auch ich erst nach einiger Zeit mit Python mitbekommen habe):
aber spätestens bei einem Constructor geht das nicht mehr.
Es gibt keine Konstruktoren in Python, die __init__ Methode ist kein Konstruktor, sondern sie erzeugt z.B. Instanzvariablen. Ein Konstruktor in C++ oder Java ist etwas das aus dem Nichts eine Instanz erzeugt, wie man aber an der Signatur von _init__ sehen kann ( __init__(*self*): ) existiert die Instanz beim Aufruf der Funktion schon.
Und überdires kann man mittels Class Methods verschiedene Konstruktoren (mit verschiedenen Parameterlisten) implementieren, wenn das wirklich notwendig ist. -- Christian Tanzer http://www.c-tanzer.at/ _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Andreas Pakulat schrieb:
On 16.Feb 2005 - 19:47:54, Christian Helmbold wrote:
wie ich gerade mit Entsetzen feststellen musste, kann man in Python gar keine Methoden überladen! Wie umgeht man diese Schwäche am elegantesten? Übergebt ihr einfach None, wenn ein Parameter leer ist? Bei normalen Methoden könnte man ja noch auf zwei Methoden mit unterschiedlichen Namen ausweichen,
Neben den anderen Antworten, die alle korrekt sind, möchte ich dich noch auf etwas hinweisen (was auch ich erst nach einiger Zeit mit Python mitbekommen habe):
aber spätestens bei einem Constructor geht das nicht mehr.
Es gibt keine Konstruktoren in Python, die __init__ Methode ist kein Konstruktor, sondern sie erzeugt z.B. Instanzvariablen. Ein Konstruktor in C++ oder Java ist etwas das aus dem Nichts eine Instanz erzeugt, wie man aber an der Signatur von _init__ sehen kann ( __init__(*self*): ) existiert die Instanz beim Aufruf der Funktion schon.
Andreas
Seit Einführung der New Style Classes (Python-2.2) gibt es sehr wohl echte Konstruktoren: __new__(cls, ...) Siehe: http://www.python.org/2.2.3/descrintro.html#__new__ Ulli _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

On 17.Feb 2005 - 08:43:50, Ulrich Berning wrote:
Andreas Pakulat schrieb:
On 16.Feb 2005 - 19:47:54, Christian Helmbold wrote: Seit Einführung der New Style Classes (Python-2.2) gibt es sehr wohl echte Konstruktoren: __new__(cls, ...) Siehe: http://www.python.org/2.2.3/descrintro.html#__new__
Verdammt ;-), ich wusste doch ich hab sowas in meinem Buch gelesen. Aber das Tutorial letztens hat darueber kein Wort verloren, sondern ebend das o.gesagte bzgl. __init__... Andreas PS: Das Tutorial war IIRC von der Python-Doku verlinkt. -- You need more time; and you probably always will. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Hallo, Am Donnerstag, 17. Feb 2005, 00:03:58 +0100 schrieb Andreas Pakulat:
On 16.Feb 2005 - 19:47:54, Christian Helmbold wrote:
wie ich gerade mit Entsetzen feststellen musste, kann man in Python gar keine Methoden überladen! Wie umgeht man diese Schwäche am elegantesten? aber spätestens bei einem Constructor geht das nicht mehr.
Es gibt keine Konstruktoren in Python, die __init__ Methode ist kein Konstruktor, sondern sie erzeugt z.B. Instanzvariablen. Ein Konstruktor in C++ oder Java ist etwas das aus dem Nichts eine Instanz erzeugt, wie man aber an der Signatur von _init__ sehen kann ( __init__(*self*): ) existiert die Instanz beim Aufruf der Funktion schon.
Das in Ruby übliche Verfahren ist in Python etwas umständlich zu formulieren (ungetestet): class C def __init__( self): pass def new1( p): o = C() o.m = p return o new1 = staticmethod( new1) @staticmethod # Python2.4 def new2( p, q): o = C() o.m, o.n = p, q return o c = C.new1( 'P') d = C.new2( 'P', 'Q') Dabei wäre dann noch der Zugriff auf `__init__()' zu sperren, indem man den normalen Konstruktor q = C() # ohne `newX' entweder umdefiniert oder den Zugriff darauf lahmlegt. Daß dies nicht geht, ärgert mich wiederum. Bertram -- Bertram Scharpf Stuttgart, Deutschland/Germany http://www.bertram-scharpf.de _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

"Andreas" == Andreas Pakulat <apaku@gmx.de> writes:
Andreas> On 16.Feb 2005 - 19:47:54, Christian Helmbold wrote: [...] >> aber spätestens bei einem Constructor geht das nicht mehr. Andreas> Es gibt keine Konstruktoren in Python, die __init__ Andreas> Methode ist kein Konstruktor, sondern sie erzeugt Andreas> z.B. Instanzvariablen. Hmm. Es scheint hier einige Begriffsverwirrungen zu geben. Für mich ist ein Constructor/Konstruktor ein Ding, das ein neu erzeugtes Objekt initialisiert und (hoffentlich) in einen wohldefinierten Zustand bringt (z.B. sicherstellt, daß alle spezifizierten Invarianten gelten). Andreas> Ein Konstruktor in C++ oder Java ist etwas das aus dem Andreas> Nichts eine Instanz erzeugt, Ich kann hier dank Unwissenheit nichts über Java sagen, aber in C++ erzeugt der Constructor/Konstruktor gar nix (außer Attributsinstanzen etc.). Wenn der aufgerufen wird, ist das Objekt schon alloziert (sei es auf dem Stack oder Heap). Verwechselst Du hier etwas mit klassenspezifischen new/delete Methoden? (Wie andere schon richtig festgestellt haben, kann man solche via Metaklassen auch in Python erstellen.) Andreas> wie man aber an der Signatur von _init__ sehen kann ( Andreas> __init__(*self*): ) existiert die Instanz beim Aufruf der Andreas> Funktion schon. Und im C++-Constructor-Body is 'this' bekannt und darf benutzt werden... Holger _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

On 17.Feb 2005 - 10:31:09, Holger Duerer wrote:
"Andreas" == Andreas Pakulat <apaku@gmx.de> writes: Hmm. Es scheint hier einige Begriffsverwirrungen zu geben.
Eigentlich nicht ;-)
Für mich ist ein Constructor/Konstruktor ein Ding, das ein neu erzeugtes Objekt initialisiert und (hoffentlich) in einen wohldefinierten Zustand bringt (z.B. sicherstellt, daß alle spezifizierten Invarianten gelten).
Jupp...
Ich kann hier dank Unwissenheit nichts über Java sagen, aber in C++ erzeugt der Constructor/Konstruktor gar nix (außer Attributsinstanzen etc.). Wenn der aufgerufen wird, ist das Objekt schon alloziert (sei es auf dem Stack oder Heap).
Jupp, ich sollte nicht Sachen aus Tutorials wiederholen wenn ich eigentlich schon zu müde zum Augen aufhalten bin... Tut mir leid, mein Irrtum.
Und im C++-Constructor-Body is 'this' bekannt und darf benutzt werden...
Ebenfalls korrekt. Andreas -- Your heart is pure, and your mind clear, and your soul devout. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Hallo Christian, On Wednesday 16 February 2005 19:47, Christian Helmbold wrote:
wie ich gerade mit Entsetzen feststellen musste, kann man in Python gar keine Methoden überladen! Wie umgeht man diese Schwäche am elegantesten?
wie andere schon geschrieben haben, ist es in der Praxis normalerweise kein Problem.
Übergebt ihr einfach None, wenn ein Parameter leer ist? Bei normalen Methoden könnte man ja noch auf zwei Methoden mit unterschiedlichen Namen ausweichen, aber spätestens bei einem Constructor geht das nicht mehr.
Mirko hatte die Übergabe einer Liste vorgeschlagen. Eine Variante ist die Übergabe mittels *args und **kwargs: def methode(self, *args, **kwargs): # args ist eine Liste, kwargs ein Dictionary, aber der Aufrufer # muss keine Liste oder ein Dictionary übergeben, sondern kann # beliebige Positions- (positional arguments) oder # Schlüsselwort-Argumente (keyword arguments) verwenden ... Aber auch das ist nur selten eine elegante Lösung. Erkläre uns bitte die Situation, in der du das Überladen von Methoden vermisst. Wahrscheinlich gibt es eine einfache Problemlösung in Python, die ohne das Überladen auskommt. Wir versuchen, die dann zu finden. :-) Viele Grüße Stefan _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Neben all den anderern sehr richtigen posts wollte ich noch auf die gnosis-utils und den dort definierten multi-method-dispatch verweisen. Damit kann man sehr einfach ueberladene Methoden realisieren - so man sie denn braucht.... MfG Diez _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (11)
-
Andreas Jung
-
Andreas Pakulat
-
Bertram Scharpf
-
Christian Helmbold
-
Diez B. Roggisch
-
Hartmut Goebel
-
Holger Duerer
-
Mirko T.
-
Stefan Schwarzer
-
tanzer@swing.co.at
-
Ulrich Berning