通过阅读文档,我完全理解getattr()和setattr()的作用。但它也明确表示getattr(x, 'foobar')
相当于x.foobar
而setattr(x, 'foobar', 123)
相当于x.foobar = 123
。
那我为什么要用它们?
答案 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.