如何通过字符串访问(获取或设置)对象属性,字符串对应于该属性的名称

288
如何设置/获取由x给定的t属性的值?
class Test:
   def __init__(self):
       self.attr1 = 1
       self.attr2 = 2

t = Test()
x = "attr1"
3个回答

500
有两个内置函数叫做getattrsetattr
getattr(object, attrname)
setattr(object, attrname, value)

在这种情况下
x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)

24
还有一个delattr函数可以用来删除属性,但很少使用。 - Dave Kirby
21
可以使用hasattr来测试一个对象是否具有特定的属性,但在这种情况下,使用三个参数的getattr(object, attrname, default)通常更好。 - Duncan
有没有办法像这样使用getattr,比如我有一个数据框df1和一个变量x='df1',即将df1作为字符串存储在变量x中。我想像这样打印df的形状:getattr(x,'shape') 或者 getattr('df1','shape')。我知道这不能通过getattr实现,还有其他方法吗? - ihightower
2
你可以执行getattr(globals()[x], 'shape') - afult
1
@ihightower 请参阅如何在字符串中给定变量名获取其值?。简而言之,如果作用域未知,则没有通用的方法可以实现它。afult的解决方案假设它是全局的,尽管它可能是这样的。 - wjandrea

8

如果您希望将逻辑隐藏在类内部,您可能更喜欢使用类似于以下方式的通用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()。在上面的示例中,您可以通过return vars(self)[varname]替换getattr(self,varname),但根据What is the difference between vars and setattr?的回答,getattr可能更可取。

3

注意:此答案非常过时。它适用于使用已于2008年弃用new模块的Python 2。

Python内置了函数setattrgetattr,可以用来设置和获取类的属性。

以下是一个简单的示例:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接