当python类实例使用点访问属性时,会发生什么



假设一个类A定义为:

class A:
def __init__(self, val):
self.val = val

a = A(3)实例化A后,执行a.val会调用哪些方法?换句话说,当执行a.val时,内部会发生什么?

此外,A通过执行A.other_val来访问一个不存在的属性,即other_val,怎么样?

我听说过内置的方法,如getattrsetattr,以及类协议方法__getattr____setattr____getattribute__,它们中的哪一个以及在执行A.*时是如何触发的?

我只找到了一些关于这方面的文件,所以任何解释问题的材料都会有所帮助。提前谢谢。

当您[尝试]使用句点表示法访问类实例属性时,将调用该类的__getattribute__方法。这可以这样证明:

class A():
def __init__(self):
self.val = 99
def __getattribute__(self, attr):
print(f'Acquiring {attr}')
return super(type(self), self).__getattribute__(attr)

a = A()
print(a.val)

输出:

Acquiring val
99

最新更新