我并不赞同这个为特别地道,但是......
假设所有的函数定义的行为相同,像“只是调用基行为self.num
类,并将所有非自变量应用于它“,然后您可以遍历所有要定义的函数名称,并使用setattr
创建每个函数名称。例如:
class MyFancyNumber(object):
def __init__(self, num, info):
self.num = num
self.info = info
def __repr__(self):
return "MyFancyNumber({}, {})".format(repr(self.num), repr(self.info))
def make_func(name):
return lambda self, *args: MyFancyNumber(getattr(self.num, name)(*args), self.info)
for name in ["__add__", "__sub__", "__mul__", "__div__", "__invert__", "__neg__", "__pos__"]:
setattr(MyFancyNumber, name, make_func(name))
x = MyFancyNumber(50, "hello")
print(x + 10)
print(x - 10)
print(x * 10)
print(x/10)
print(~x)
print(-x)
print(+x)
结果:
MyFancyNumber(60, 'hello')
MyFancyNumber(40, 'hello')
MyFancyNumber(500, 'hello')
MyFancyNumber(5, 'hello')
MyFancyNumber(-51, 'hello')
MyFancyNumber(-50, 'hello')
MyFancyNumber(50, 'hello')
编辑:我不知道你是否想运算的结果是一个MyFancyNumber或常规内置数值类型,但无论是这样,执行是非常相似的:
class MyFancyNumber(object):
def __init__(self, num, info):
self.num = num
self.info = info
def __repr__(self):
return "MyFancyNumber({}, {})".format(repr(self.num), repr(self.info))
def make_func(name):
return lambda self, *args: getattr(self.num, name)(*args)
for name in ["__add__", "__sub__", "__mul__", "__div__", "__invert__", "__neg__", "__pos__"]:
setattr(MyFancyNumber, name, make_func(name))
x = MyFancyNumber(50, "hello")
print(x + 10)
print(x - 10)
print(x * 10)
print(x/10)
print(~x)
print(-x)
print(+x)
结果:
60
40
500
5
-51
-50
50
https://docs.python.org/3/library/numbers.html这可能会帮助您开始。 –
以这种方式使用'__add__'可能无法做到你想要的。 'MyFancyNumber(1,'abc')+ 1'会给你一个'int'对象,而不是'MyFancyNumber'。 –
据我所知,他不想返回一个MyFancyNumber,他只想把所有的功能都作为运算符术语中的一个数字。 – Szabolcs