我试图理解 和 之间的区别__getattr__,__getattribute__但是,我失败了。
__getattr__
__getattribute__
堆栈溢出问题 vs之间的差异的答案说:__getattr__ __getattribute__
__getattribute__在查看对象的实际属性之前调用,因此正确实现可能很棘手。您可以很容易地以无限递归告终。
我完全不知道这意味着什么。
然后它继续说:
你几乎肯定想要__getattr__。
为什么?
我读到如果__getattribute__失败,__getattr__则调用。那么为什么有两种不同的方法做同样的事情呢?如果我的代码实现了新的样式类,我应该使用什么?
我正在寻找一些代码示例来解决这个问题。我已经尽我所能在谷歌上搜索,但我找到的答案并没有彻底讨论这个问题。
如果有任何文件,我准备阅读。
对于对象,您需要处理它们的属性。通常,我们会这样做instance.attribute。有时我们需要更多的控制(当我们事先不知道属性的名称时)。
instance.attribute
例如,instance.attribute将成为getattr(instance, attribute_name). 使用此模型,我们可以通过提供 属性名称 作为字符串来获取属性。
getattr(instance, attribute_name)
您还可以告诉一个类如何处理它没有明确管理的属性,并通过__getattr__方法来做到这一点。
每当您请求尚未定义的属性时,Python 都会调用此方法,因此您可以定义如何处理它。
一个经典的用例:
class A(dict): def __getattr__(self, name): return self[name] a = A() # Now a.somekey will give a['somekey']
如果您需要捕获每个属性, 无论它是否存在 ,请__getattribute__改用。不同之处在于__getattr__只调用实际上不存在的属性。如果您直接设置属性,则引用该属性将检索它而无需调用__getattr__.
__getattribute__一直被称为。