Operator overloading

In Python können Standardoperationen, wie +, *, etc für beliebige Klassen definiert werden. Dazu muss nur eine Methode mit Namen __add__(...) in der Klasse definiert sein:


class ThreeVec(object):
    ...
    def Add( self, tv ): # Add function
        newvec = ThreeVec( self.x+tv.x, self.y+tv.y, self.z+tv.z)
        return newvec
    def __add__( self, tv ): # dasselbe aber fuer + Operator
        "method for overloading the + operator"
        newvec = ThreeVec( self.x+tv.x, self.y+tv.y, self.z+tv.z)
        return newvec

und schon kann man statt

u = ThreeVec(1.,1.,-1.)
v = ThreeVec(2.,0.,3.)
w = u.Add( v )

einfach schreiben
z = u + v # equivalent, calls u.__add__(v)

Operator overloading prinzipiell möglich für alle Python–Operationen
* : __mul__ , - : __sub__ , / : __div__ ,
< : __lt__ , > : __gt__ , == : __eq__ , .....

aber nicht immer sinnvoll:
z = u * v

Multiplikation von Dreier-Vektoren ist Skalar– oder Vektorprodukt ??

Besser nicht implementieren in diesem Fall und stattdessen aussagekräftige Funktionsnamen verwenden, u.SkalProd(v); u.CrossProd(v)