我並不贊同這個爲特別地道,但是......
假設所有的函數定義的行爲相同,像「只是調用基行爲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