为什么要使用setattr()和getattr()内置函数?

时间:2013-10-01 18:52:11

标签: python python-3.x

通过阅读文档,我完全理解getattr()setattr()的作用。但它也明确表示getattr(x, 'foobar')相当于x.foobarsetattr(x, 'foobar', 123)相当于x.foobar = 123

那我为什么要用它们?

4 个答案:

答案 0 :(得分:36)

因为您也可以使用动态变量:

somevar = 'foo'
getattr(x, somevar)

使用常规属性访问语法无法做到这一点。

请注意,getattr()也会使用可选的默认值,如果属性缺失则返回

>>> x = object()
>>> getattr(x, 'foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'foo'
>>> getattr(x, 'foo', 42)
42

使用getattr(),您可以从其他内容中提取属性名称,而不是文字:

for attrname in dir(x):
    print('x.{} = {!r}'.format(attrname, getattr(x, attrname))

或者您可以使用setattr()设置动态属性:

for i, value in enumerate(dynamic_values):
    setattr(i, 'attribute{}'.format(i), value)

答案 1 :(得分:8)

如果要访问的属性是变量而不是文字字符串,则使用它们。它们允许您参数化属性访问/设置。

没有理由做getattr(x, 'foobar'),但您可能有一个名为attr的变量可以设置为“foobar”或“otherAttr”,然后执行getattr(x, attr)

答案 2 :(得分:2)

另一种情况可能表明它们并不完全相同:

class A:
    def __init__(self):
        self.__var = 10
        setattr(self, '__var2', 100)

a = A()
print(a.__var2)
# 100
print(a.__var)
# AttributeError: 'A' object has no attribute '__var'

至少setattr.不同。

答案 3 :(得分:1)

当您可能需要其属性的对象可能是None时,我发现它最有用。下面示例;

obj = None
attr_val = getattr(obj, 'anyvar', None) #This is not an error.