我理解在python中,无论何时访问类/实例变量,它都会调用__getattribute__
方法来获取结果。但是我也可以直接使用obj.__dict__['x']
,并得到我想要的东西。
我有点困惑有什么区别?
另外,当我使用getattr(obj, name)
时,是否在内部调用__getattribute__
或obj.__dict__[name]
?
提前致谢。
答案 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__
中找到。