什么时候 getattr() 不像正常的属性访问?

lar*_*sks 6 python

这段代码之间有什么区别,它使用点表示法进行属性访问:

def get_foo(self):
    try:
        return self._attribute
    except AttributeError:
        self._attribute = 'something'
        return self._attribute
Run Code Online (Sandbox Code Playgroud)

以及使用该getattr函数的以下代码:

def get_foo(self):
    try:
        return getattr(self, '_attribute')
    except AttributeError:
        self._attribute = 'something'
        return self._attribute
Run Code Online (Sandbox Code Playgroud)

他们对我来说似乎表现得一样,但我在一些代码中遇到了后一个例子,我很好奇为什么getattr()在这种情况下会选择调用。

mgi*_*son 4

根据文档,它们是等效的(除非提供第三个参数来抑制AttributeError属性不存在时的情况)。

\n\n
\n

返回对象的命名属性的值。名称必须是字符串。如果字符串是 object\xe2\x80\x99s 属性之一的名称,则结果是该属性的值。例如,getattr(x, \'foobar\')相当于x.foobar. 如果指定的属性不存在,则返回默认值(如果提供),否则AttributeError引发。

\n
\n\n

我想不出有什么理由getattr比普通的点符号更喜欢这里。。。我唯一能想到我可能会想使用前者的地方是,如果我试图阻止我的 linter 抱怨protected-access(如果您有正当理由这样做,最好使用编译指示禁用它)。。。

\n