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

tem*_*ame 24 python python-3.x

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

那我为什么要用呢?

Mar*_*ers 41

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

somevar = 'foo'
getattr(x, somevar)
Run Code Online (Sandbox Code Playgroud)

您不能使用常规属性访问语法来执行此操作.

请注意,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
Run Code Online (Sandbox Code Playgroud)

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

for attrname in dir(x):
    print('x.{} = {!r}'.format(attrname, getattr(x, attrname))
Run Code Online (Sandbox Code Playgroud)

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

for i, value in enumerate(dynamic_values):
    setattr(i, 'attribute{}'.format(i), value)
Run Code Online (Sandbox Code Playgroud)

  • 很好的解释。但值得注意的是,很多时候,如果你认为你想要这个,你其实并不想要;该属性首先应该是字典中的值而不是属性。 (3认同)

Bre*_*arn 8

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

没有理由这样做getattr(x, 'foobar'),但你可能有一个被称为attr"foobar"或"otherAttr" 的变量,然后就可以了getattr(x, attr).


Hou*_* Lu 7

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

\n\n
class A:\n    def __init__(self)\xef\xbc\x9a\n        self.__var = 10\n        setattr(self, '__var2', 100)\n\na = A()\nprint(a.__var2)\n# 100\nprint(a.__var)\n# AttributeError: 'A' object has no attribute '__var'\n
Run Code Online (Sandbox Code Playgroud)\n\n

至少,setattr与 不完全相同.

\n