假设一个类A
定义为:
class A:
def __init__(self, val):
self.val = val
a = A(3)
实例化A
后,执行a.val
会调用哪些方法?换句话说,当执行a.val
时,内部会发生什么?
此外,A
通过执行A.other_val
来访问一个不存在的属性,即other_val
,怎么样?
我听说过内置的方法,如getattr
和setattr
,以及类协议方法__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