在Python2.5中,是否有方法创建装饰类的装饰器?具体来说,我想使用装饰器向类中添加一个成员,并更改构造函数以获取该成员的值
正在查找以下内容(在“class Foo:”上有语法错误):
def getId(self):返回self.\uu id
附加类(原始类):
定义初始化(self,id,*args,**kws):
self.\uu id=id
self.getId=getId
原始类。初始类(self,*args,**kws)
@阿迪德
Foo类:
定义初始值(自身,值1):
self.value1=value1
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
foo1=Foo(5,1)
打印foo1.value1,foo1.getId()
foo2=Foo(15,2)
打印foo2.value1,foo2.getId()
我想我真正想要的是一种在Python中实现C#接口的方法。我想我需要切换我的范例
除了类装饰器是否是问题的正确解决方案之外:
在Python 2.6及更高版本中,有带@语法的类装饰器,因此您可以编写:
@addID
Foo类:
通过
在旧版本中,您可以采用另一种方式:
类Foo:
通过
Foo=addID(Foo)
但是请注意,这与函数decorators的工作原理相同,并且decorator应该返回新的(或修改过的原始)类,这不是您在示例中所做的。addID decorator如下所示:
添加定义(原始类):
原始初始化=原始类__
#复制原始的uuu init uuuu,这样我们就可以不递归地调用它
定义初始化(self,id,*args,**kws):
self.\uu id=id
self.getId=getId
orig_init(self,*args,**kws)#调用原始的__init__
原始类。uuuu init_uuuu=uuuu init_u35;将类“uuu init_uuu”设置为新类
返回原始类
然后,您可以对Python版本使用适当的语法,如上所述
但我同意其他人的观点,如果您想覆盖\uuuu init\uuuu,那么继承更合适