2014-02-14 117 views
0

我對着添加類從字符串列表動態屬性問題,請考慮以下情形:蟒蛇動態創建屬性類

這是我的課:

class Customer(object): 
    def __init__(self,**kw): 
     self.__dict__ = kw 

    def add_attributes(self,**kw): 
     self.__dict__.update(kw) 

#a group of attributes i want to associate with the class 
list = [] 
list.append("name") 
list.append("age") 
list.append("gender") 

Customer c 

for i in list: 
    # i is the attribute name for the class 
    c.add_attributes(i = "test") 

這個問題似乎是事實它是治療的屬性名稱作爲字符串,可有人請告知

+0

c =客戶(),那是錯誤? –

+0

你必須糾正縮進.. –

+0

OT:不要使用'list'作爲變量,否則這將覆蓋標準的'list'功能...... – Don

回答

2

i = "test"傳遞給**kwargsadd_attributes時,實際上轉化爲{'i':'test'},所以你需要這樣做mething這樣的:相反

for i in my_list: 
    c.add_attributes(**{ i : "test"}) 
+1

謝謝你的工作,請你解釋一下這是如何工作的? – godzilla

+1

這產生了以'i'作爲關鍵字,'test'作爲值的字典,然後使用'** kw'語法將字典作爲關鍵字參數應用於'c.add_attributes()'方法。 –

+0

@godzilla閱讀關於關鍵字參數:http://docs.python.org/2/tutorial/controlflow.html#keyword-arguments –

1

直接更新__dict__的,你可以使用內置setattr方法:

for i in list: 
    # i is the attribute name for the class 
    setattr(c, i, "test") 

在我看來,與內部屬性玩應該是最後的手段。

0

而不是一個for循環,你可以使用dict.fromkeys

c.add_attributes(**dict.fromkeys(seq, "test")) 

因爲

In [13]: dict.fromkeys(seq, "test") 
Out[13]: {'age': 'test', 'gender': 'test', 'name': 'test'} 

**告訴Python中的字典解壓到關鍵字參數。 語法解釋爲heredocs, here


順便說一句,最好不要使用list作爲變量名,因爲它使得難以訪問同名的內置。