2008-11-12 109 views
135

假設我有一個python對象x和一個字符串s,如何在x上設置屬性s?所以:如何以編程方式設置屬性?

>>> x = SomeObject() 
>>> attr = 'myAttr' 
>>> # magic goes here 
>>> x.myAttr 
'magic' 

什麼是魔術?順便說一句,這個目標是將呼叫緩存到x.__getattr__()

回答

208
setattr(x, attr, 'magic') 

有關它的幫助:

>>> help(setattr) 
Help on built-in function setattr in module __builtin__: 

setattr(...) 
    setattr(object, name, value) 

    Set a named attribute on an object; setattr(x, 'y', v) is equivalent to 
    ``x.y = v''. 

編輯:但是,您應注意(在評論中指出),你不能這樣對待對象的「純」的實例。但它可能有一個簡單的對象的子類,它可以正常工作。我強烈要求O.P.永遠不要這樣做。

+8

小心,但是,這並不在你的情況下工作,在那裏你創建對象的實例()。 – 2008-11-12 19:42:58

+3

絕對正確,但沒有。我很方便地忽略了。我強烈要求O.P.永遠不要這樣做。 – 2008-11-12 19:44:18

40

通常,我們爲此定義類。

class XClass(object): 
    def __init__(self): 
     self.myAttr= None 

x= XClass() 
x.myAttr= 'magic' 
x.myAttr 

但是,您可以在一定程度上,與setattrgetattr內置功能做到這一點。但是,它們不直接在object的實例上工作。

>>> a= object() 
>>> setattr(a, 'hi', 'mom') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'object' object has no attribute 'hi' 

但是,他們的確可以處理各種簡單的類。

class YClass(object): 
    pass 

y= YClass() 
setattr(y, 'myAttr', 'magic') 
y.myAttr 
10

設X是一個對象,那麼你可以做兩種方式

x.attr_name = s 
setattr(x, 'attr_name', s) 
相關問題