【发布时间】:2013-02-08 04:47:13
【问题描述】:
我想要一个包装类,它的行为与它所包装的对象完全一样,只是它添加或覆盖了一些选择方法。
我的代码目前如下所示:
# Create a wrapper class that equips instances with specified functions
def equipWith(**methods):
class Wrapper(object):
def __init__(self, instance):
object.__setattr__(self, 'instance',instance)
def __setattr__(self, name, value):
object.__setattr__(object.__getattribute__(self,'instance'), name, value)
def __getattribute__(self, name):
instance = object.__getattribute__(self, 'instance')
# If this is a wrapped method, return a bound method
if name in methods: return (lambda *args, **kargs: methods[name](self,*args,**kargs))
# Otherwise, just return attribute of instance
return instance.__getattribute__(name)
return Wrapper
为了测试这一点,我写道:
class A(object):
def __init__(self,a):
self.a = a
a = A(10)
W = equipWith(__add__ = (lambda self, other: self.a + other.a))
b = W(a)
b.a = 12
print(a.a)
print(b.__add__(b))
print(b + b)
当在最后一行时,我的解释器抱怨:
Traceback (most recent call last):
File "metax.py", line 39, in <module>
print(b + b)
TypeError: unsupported operand type(s) for +: 'Wrapper' and 'Wrapper'
这是为什么?如何让我的包装类按照我想要的方式运行?
【问题讨论】:
-
stackoverflow.com/questions/972/… 我想这也可能是问题的一部分。
-
这个问题看起来像元类通常解决的问题。