python - Changing the order of operation for __add__, __mul__, etc. methods in a custom class -
i have vector class:
class vector: def __init__(self, x, y): self.x, self.y = x, y def __str__(self): return '(%s,%s)' % (self.x, self.y) def __add__(self, n): if isinstance(n, (int, long, float)): return vector(self.x+n, self.y+n) elif isinstance(n, vector): return vector(self.x+n.x, self.y+n.y)
which works fine, i.e. can write:
a = vector(1,2) print(a + 1) # prints (2,3)
however if order of operation reversed, fails:
a = vector(1,2) print(1 + a) # raises typeerror: unsupported operand type(s) # +: 'int' , 'instance'
i understand error: addition of int
object vector
object undefined because haven't defined in int
class. there way work around without defining in int
(or parent of int
) class?
you need define __radd__
some operations not evaluate + b == b + , that's why python defines add , radd methods.
explaining myself better: supports fact "int" not define +
operation class vector
instances part of operation. therefore vector + 1 not same 1 + vector.
when python tries see 1.__add__
method can do, exception raised. , python goes , looks vector.__radd__
operation try complete it.
in op's case evaluation true , suffices __radd__ = __add__
class vector(object): def __init__(self, x, y): self.x, self.y = x, y def __str__(self): return '(%s,%s)' % (self.x, self.y) def __add__(self, n): if isinstance(n, (int, long, float)): return vector(self.x+n, self.y+n) elif isinstance(n, vector): return vector(self.x+n.x, self.y+n.y) __radd__ = __add__ = vector(1, 2) print(1 + a)
which outputs:
(2,3)
the same applies number-like operations.
Comments
Post a Comment