2008-11-12 63 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) 
相关问题