【发布时间】:2013-06-11 21:32:28
【问题描述】:
为了继承 float 并使用包装器覆盖多个数字运算,我查看了 this example 并尝试了以下操作:
def naturalize(*methods):
def decorate(cls):
for method in methods:
method = '__' + method + '__'
original = getattr(cls.__base__, method)
setattr(cls, method, lambda self, *args, **kwargs: cls(original(self, *args, **kwargs)))
return cls
return decorate
@naturalize('add', 'sub', 'mul')
class P(float):
pass
print('Test result:', P(.1) + .2, P(.1) - .2, P(.1) * .2)
# Test result: 0.020000000000000004 0.020000000000000004 0.020000000000000004
这不起作用:__add__、__sub__ 和 __mul__ 都像 __mul__ 一样工作。于是我查看了this other example 并尝试了:
def naturalize(*methods):
def decorate(cls):
def native(method):
original = getattr(cls.__base__, method)
return lambda self, *args, **kwargs: cls(original(self, *args, **kwargs))
for method in methods:
method = '__' + method + '__'
setattr(cls, method, native(method))
return cls
return decorate
@naturalize('add', 'sub', 'mul')
class P(float):
pass
print('Test result:', P(.1) + .2, P(.1) - .2, P(.1) * .2)
#Test result: 0.30000000000000004 -0.1 0.020000000000000004
现在,这确实奏效了。但我仍然不确定我的第一种方法到底出了什么问题。谁能向我解释一下__add__、__sub__ 和__mul__ 到底是如何像__mul__ 一样工作的?
【问题讨论】:
标签: python class inheritance overriding wrapper