我如何在init中为类创建属性? 如果我使用此代码:
In [1]: import functools
In [2]: def test(id, wrap):
...: return id*2
In [3]: class A(object):
...: def __init__(self, id):
...: self.id = id
...: setattr(self.__class__, 'testing', property(functools.partial(test, self.id)))
In [4]: cl = []
In [5]: for i in range(5):
...: cl.append(A(i))
...:
In [6]: for b in cl:
...: print b.testing
我明白了:
8
8
8
8
8
我理解为什么会这样(因为类的属性安装,而不是例如)。但我不明白如何添加属性实例?如果在setattr中使用self,我会得到:
<property object at 0x1018def70>
<property object at 0x1018e9050>
<property object at 0x1018e9100>
<property object at 0x1018e91b0>
<property object at 0x1018e9260>
我读过这个主题:create class properties,但不明白,如何将id放到元类
答案 0 :(得分:2)
您确实不应该允许实例在其类中放置属性。 如果你有很多实例会怎么样?每个实例都会覆盖以前的属性定义。 (的确,这就是你发布的输出中有5个8的原因。)
更好的是:
class A(object):
@property
def testing(self):
return functools.partial(test, self.id)
def __init__(self, id):
self.id = id
for b in cl:
print b.testing(1)
产生
0
2
4
6
8