在Python 2.5中,有没有办法创建一个装饰类的装饰器?具体来说,我想使用装饰器将一个成员添加到类中,并更改构造函数以获取该成员的值.
寻找类似下面的内容(在'class Foo:'上有语法错误:
def getId(self): return self.__id
class addID(original_class):
def __init__(self, id, *args, **kws):
self.__id = id
self.getId = getId
original_class.__init__(self, *args, **kws)
@addID
class Foo:
def __init__(self, value1):
self.value1 = value1
if __name__ == '__main__':
foo1 = Foo(5,1)
print foo1.value1, foo1.getId()
foo2 = Foo(15,2)
print foo2.value1, foo2.getId()
Run Code Online (Sandbox Code Playgroud)
我想我真正想要的是在Python中做一些类似C#接口的方法.我想我需要切换我的范例.
我正在尝试创建一个Python属性,其中就地添加由不同的方法处理,而不是检索值,添加另一个值并重新分配.因此,对于x对象上的属性o,
o.x += 5
Run Code Online (Sandbox Code Playgroud)
应该不同于
o.x = o.x + 5
Run Code Online (Sandbox Code Playgroud)
最终的价值o.x应该是相同的,以免混淆人们的期望,但我想让就地增加更有效率.(实际上,操作比简单添加需要更多的时间.)
我的第一个想法是在课堂上定义
x = property(etc. etc.)
x.__iadd__ = my_iadd
Run Code Online (Sandbox Code Playgroud)
但这引发了一个AttributeError,大概是因为property工具__slots__?
我的下一次尝试使用描述符对象:
class IAddProp(object):
def __init__(self):
self._val = 5
def __get__(self, obj, type=None):
return self._val
def __set__(self, obj, value):
self._val = value
def __iadd__(self, value):
print '__iadd__!'
self._val += value
return self
class TestObj(object):
x = IAddProp()
#x.__iadd__ = IAddProp.__iadd__ # doesn't help
>>> o = TestObj()
>>> print o.x
5 …Run Code Online (Sandbox Code Playgroud)