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)