小编典典

了解 __getattr__ 和 __getattribute__ 之间的区别

all

我试图理解 和 之间的区别__getattr____getattribute__但是,我失败了。

堆栈溢出问题 vs之间的差异的答案说:__getattr__ __getattribute__

__getattribute__在查看对象的实际属性之前调用,因此正确实现可能很棘手。您可以很容易地以无限递归告终。

我完全不知道这意味着什么。

然后它继续说:

你几乎肯定想要__getattr__

为什么?

我读到如果__getattribute__失败,__getattr__则调用。那么为什么有两种不同的方法做同样的事情呢?如果我的代码实现了新的样式类,我应该使用什么?

我正在寻找一些代码示例来解决这个问题。我已经尽我所能在谷歌上搜索,但我找到的答案并没有彻底讨论这个问题。

如果有任何文件,我准备阅读。


阅读 66

收藏
2022-05-20

共1个答案

小编典典

先说一些基础知识。

对于对象,您需要处理它们的属性。通常,我们会这样做instance.attribute。有时我们需要更多的控制(当我们事先不知道属性的名称时)。

例如,instance.attribute将成为getattr(instance, attribute_name). 使用此模型,我们可以通过提供
属性名称 作为字符串来获取属性。

用于__getattr__

您还可以告诉一个类如何处理它没有明确管理的属性,并通过__getattr__方法来做到这一点。

每当您请求尚未定义的属性时,Python 都会调用此方法,因此您可以定义如何处理它。

一个经典的用例:

class A(dict):
    def __getattr__(self, name):
       return self[name]
a = A()
# Now a.somekey will give a['somekey']

注意事项和使用__getattribute__

如果您需要捕获每个属性, 无论它是否存在
,请__getattribute__改用。不同之处在于__getattr__只调用实际上不存在的属性。如果您直接设置属性,则引用该属性将检索它而无需调用__getattr__.

__getattribute__一直被称为。

2022-05-20