第一个代码段:
class A:
def __init__(self):
print(self.__dict__)
def __getattr__(self, name):
print("get")
def __setattr__(self, name, value):
print("set")
# def __getattribute__(self, name):
# print("getatrr")
a = A()
它显示{}
并且功能__getattr__
没有被调用,这意味着属性__dict__
存在。
第二个片段:
class A:
def __init__(self):
print(self.__dict__)
def __getattr__(self, name):
print("get")
def __setattr__(self, name, value):
print("set")
def __getattribute__(self, name):
print("getatrr")
a = A()
它打印getatrr
和None
,这意味着属性__dict__
不存在。
为什么在第一种情况下__dict__
{}
在第二种情况下为何None
?
答案 0 :(得分:1)
问题在于,当您定义以下内容时:
def __getattribute__(self, name):
print("getatrr")
您要覆盖__getattribute__
,而该{应该返回 。由于您未返回任何内容,因此您尝试使用的每个属性都会获得None
。
此方法应返回(计算出的)属性值或引发AttributeError异常
一种定义它的可行方法是在后备情况下调用object.__getattribute__
(在我的示例中,我在__dict__
上添加了一个小测试,它打印:
def __getattribute__(self, name):
if name == "__dict__":
print("get attribute invoked with __dict__")
return object.__getattribute__(self,name)
最后,硬属性查找工作是通过调用python运行时的object.__getattribute__
完成的。