2011-08-15 73 views
2

我如何可以在init中創建類的屬性? 如果我使用此代碼:__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自我,我得到:

<property object at 0x1018def70> 
<property object at 0x1018e9050> 
<property object at 0x1018e9100> 
<property object at 0x1018e91b0> 
<property object at 0x1018e9260> 

我讀這個話題:create class properties,但不明白,怎麼把id來元類

回答

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 
+0

我覺得這個方法,並嘗試做這個[專題](http://stackoverflow.com/questions/5078726/設置-A-財產內部-A-蟒法) – gigimon