我有一个自定义类,我想重载几个艺术运算符,想知道是否有一种方法可以避免分别为每个运算符编写代码。我还没有找到任何例子,不显式重载每个运算符一个接一个。
class Foo(object):
a=0
def __init__(self, a):
self.a=a
def __add__(self, other):
#common logic here
return Foo(self.a+other.a)
def __sub__(self, other):
#common logic here
return Foo(self.a-other.a)
def __mul__(self, other):
#common logic here
return Foo(self.a*other.a)
#etc...
逻辑比这个稍微复杂一点,但常见的模式是每个运算符重载方法包含一些相同的代码来检查是否允许该操作,然后使用类成员构造一个操作。我想减少冗余代码。这是有效的:
class Foo(object):
a=0
def __init__(self, a):
self.a=a
def operate(self, other, operator):
#common logic here
a = constructOperation(self.a, other.a, operator)
return Foo(a)
def __add__(self, other):
return self.operate(other, "+")
def __sub__(self, other):
return self.operate(other, "-")
def constructOperation(operand0, operand1, operator):
if operator=="+":
return operand0 + operand1
if operator=="-":
return operand0 - operand1
但像这样手工构建操作似乎有点傻。这种方法有意义吗?还是有更好的方法?
最佳答案
您可以通过反射和更高阶的函数来实现,尽管这可能对继承不起作用。
import operator
def apply_a(func):
def inner(self, other):
return Foo(func(self.a, other.a))
return inner
class Foo(object):
def __init__(self, a=0):
self.a = a
for name in ['__add__','__mul__','__sub__']:
setattr(Foo, name, apply_a(getattr(operator, name)))