如何访问对应于该属性名称的给定字符串的对象属性

时间:2010-04-10 07:22:53

标签: python object attributes

如何设置/获取t给出的x属性值?

class Test:
   def __init__(self):
       self.attr1 = 1
       self.attr2 = 2

t = Test()
x = "attr1"

3 个答案:

答案 0 :(得分:209)

有一些名为getattrsetattr

的内置函数
getattr(object, attrname)
setattr(object, attrname, value)

在这种情况下

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)

答案 1 :(得分:2)

注意:这个答案已经过时了。它适用于使用deprecated in 2008new模块的Python 2。

在函数setattr和getattr中内置了python。可用于设置和获取类的属性。

一个简短的例子:

>>> from new import  classobj

>>> obj = classobj('Test', (object,), {'attr1': int, 'attr2': int}) # Just created a class

>>> setattr(obj, 'attr1', 10)

>>> setattr(obj, 'attr2', 20)

>>> getattr(obj, 'attr1')
10

>>> getattr(obj, 'attr2')
20

答案 2 :(得分:1)

如果要将逻辑隐藏在类内部,则可能更喜欢使用通用的getter方法,如下所示:

class Test:
    def __init__(self):
        self.attr1 = 1
        self.attr2 = 2

    def get(self,varname):
        return getattr(self,varname)

t = Test()
x = "attr1"
print ("Attribute value of {0} is {1}".format(x, t.get(x)))

输出:

Attribute value of attr1 is 1

另一个可以更好地隐藏它的方法是使用魔术方法__getattribute__,但是我一直遇到一个无限循环,当试图在该方法中检索属性值时,我无法解决该循环。

还请注意,您也可以使用vars()。在上面的示例中,您可以用getattr(self,varname)交换return vars(self)[varname],但是根据对What is the difference between vars and setattr?的回答,getattr可能更可取。