您只需将property对象本身复制到新类中。它将保存对getter、setter和deleter函数的引用,不需要跨这些函数进行复制。在
对于新样式的类,您的代码无法工作;您不能将分配给class__dict__属性:>>> item = SetProperties(Item01Object)
Traceback (most recent call last):
File "", line 1, in
File "", line 4, in SetProperties
TypeError: 'dictproxy' object does not support item assignment
使用setattr()来设置新样式类的属性:
^{pr2}$
请注意,property对象是跨批发复制的。在
演示:>>> class Item01Object(object):
... properties = ["a","c"]
... ATTR = None
...
>>> def SetProperties( ItemObject ):
... for propName, cls in AttrContainer.__dict__.iteritems():
... if propName in ItemObject.properties:
... setattr(ItemObject, propName, cls.__dict__[propName])
... return ItemObject()
...
>>> item = SetProperties(Item01Object)
>>> item
>>> item.a
>>> item.a = 20
>>> item.a
23.021
不过,您只需跨property对象复制到目标类一次;函数返回一个实例意味着您计划将其用于创建的所有实例。在
我会让它变成一个装饰师:def set_properties(cls):
for name, propcls in vars(AttrContainer).iteritems():
if name in cls.properties:
setattr(cls, name, vars(propcls)[name])
return cls
然后在您的每个Item*Object类上使用此选项:@set_properties
class Item01Object(object):
properties = ["a","c"]
ATTR = None
@set_properties
class Item02Object(object):
properties = ["b","c"]
ATTR = None
演示:>>> def set_properties(cls):
... for name, propcls in vars(AttrContainer).iteritems():
... if name in cls.properties:
... setattr(cls, name, vars(propcls)[name])
... return cls
...
>>> @set_properties
... class Item01Object(object):
... properties = ["a","c"]
... ATTR = None
...
>>> @set_properties
... class Item02Object(object):
... properties = ["b","c"]
... ATTR = None
...
>>> item01 = Item01Object()
>>> item01.c = 20
>>> item01.c
3
>>> item02 = Item02Object()
>>> item02.b = 42
Traceback (most recent call last):
File "", line 1, in
AttributeError: can't set attribute
>>> item02.b
'Something'