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


153

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

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

t = Test()
x = "attr1"

Answers:


284

有称为getattr和的内置函数。setattr

getattr(object, attrname)
setattr(object, attrname, value)

在这种情况下

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

12
也有删除属性的delattr,但这很少使用。
Dave Kirby

11
使用hasattr来测试对象是否具有特定的attr,尽管在这种情况下,使用三个参数形式的getattr(object,attrname,default)通常会更好。
邓肯

无论如何,我们可以像这样使用getattr并说我有一个dataframe df1和一个变量x = 'df1'df1作为var x中的字符串。我想打印DF的形状,这样,getattr(x, 'shape')或者getattr('df1', 'shape')。我知道用getattr和其他任何方法都无法做到这一点。
ihightower

3

注意:此答案非常过时。它适用new使用2008不推荐使用的模块的Python 2 。

有内置的python函数setattr和getattr。可以用来设置和获取类的属性。

一个简单的例子:

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

0

如果要将逻辑隐藏在类内部,则可能更喜欢使用通用的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

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

另请注意,您也可以使用vars()。在上面的示例中,您可以getattr(self,varname)通过进行交换return vars(self)[varname],但getattr根据之间的区别varssetattr是最好的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.