dP. hat geschrieben:Genauso, wie ein Compiler!?
Code: Alles auswählen
def __add__(a, b):
return a + b
def __add__(a, b):
return a - b
a = MyNumberType(3)
b = AnotherNumberType(4)
c = a + b
Was steht in c?
In C nix, da kann man keine Operatoren überladen.
In C++
Code: Alles auswählen
ResultingType operator + (MyNumberType & lhs, AnotherNumberType & rhs ) { return ResultingType( lhs.Value + rhs.Value ); }
ResultingType operator + (AnotherNumberType & lhs, MyNumberType & rhs ) { return rhs + lhs; } // Kommutativgesetz
dP. hat geschrieben:und woher weiß der Interpreter, welches __add__ er nehmen soll, wenn man keine Funktionen an Hand von Typen überladen kann? Daher finde ich es hier ganz richtig, dass man nur die Möglichkeit einer Überladung in der Klasse hat.
Ich habe auch nie behauptet, dass ich die schwache Typisierung in Python in irgendeiner Form gutheißen würde.
Und ich sehe auch nicht ein, einen Mangel einer Sprache durch einen anderen Mangel zu entschuldigen.
dP. hat geschrieben:Was dumm ist:
Code: Alles auswählen
a = MyNumber(5)
a + 3 # funktioniert
3 + a # TypeError
In C++ kein Problem.
dP. hat geschrieben:
Es geht mir um die Frage der Definition eines überladenen Operators. Und hier finde ich die Syntax eher bescheiden, bei C sage ich dass ich einen Operator überladen möchte und welchen. Bei Python muss ich mir eine Zuordnung zwischen Operator (+ == add) und diese ätzenden Unterstriche, die ich so auch ablehene.
Gut, über Geschmack lässt sich streiten. Bei Python bedeutet ein führender Bodenstrich halt 'Achtung, Objektinterna' und zwei führende Bodenstriche das selbe, nur dass die Namen noch verändert werden. Damit es bei Vererbung keine Probleme gibt. Schon sinnvoll die Regel, aber gerade bei häufigen Methoden wie __init__, die man auch mal von ausserhalb einer Klasse aufruft, schon unschön.
Sicher kann man über Geschmack streiten. Allerdings sollte der Geschmack da zurücktreten, wo Konsistenz gefragt wird. Ich sehe den Zusammenhang zwischen a+b und "operator +" als deutlicher gegeben, als bei __add__. Über __+__ hätte man noch reden können, aber hier werden zusätzliche Schlüsselwörter verbraten, die eigentlich nicht notwendig sind.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.