python中__getattribute__和obj .__ dict __ ['x']之间的区别?

时间:2015-12-31 08:35:55

标签: python class attributes

我理解在python中,无论何时访问类/实例变量,它都会调用__getattribute__方法来获取结果。但是我也可以直接使用obj.__dict__['x'],并得到我想要的东西。

我有点困惑有什么区别? 另外,当我使用getattr(obj, name)时,是否在内部调用__getattribute__obj.__dict__[name]

提前致谢。

3 个答案:

答案 0 :(得分:1)

__getattribute__()方法用于较低级别的属性处理。

默认实现尝试查找名称 在内部__dict__(或__slots__)。如果找不到该属性,则会调用__getattr__()

更新(如评论中所示):

它们是在Python数据模型中查找属性的不同方法。它们是内部方法,旨在在任何可能的情况下正确回退。一条线索:"机器位于object.__getattribute__(),将b.x转换为type(b).__dict__['x'].__get__(b, type(b))。"来自docs.python.org/3/howto/descriptor.html

答案 1 :(得分:0)

并非每个python对象都有一个存储其属性的字典,还有需要计算的插槽,属性和属性。您还可以覆盖__getattribute____getattr__。与简单的字典查找相比,属性访问更复杂。因此,访问属性的常规方法是

obj.x

你有一个带有属性名称的变量:

getattr(obj, name)

通常,您不应使用内部属性__xxx__

答案 2 :(得分:0)

copy constructor中的属性只是对象拥有的所有属性的子集。

考虑这个课程:

__dict__

此类的实例class C: ac = "+AC+" def __init__(self): self.ab = "+AB+" def show(self): pass 将包含属性ic = C()'ab''ac'(以及其他几个)。 'show'会找到所有内容,但只有' ab'存储在__gettattribute__中。其他两个可以在ic.__dict__中找到。