__dict__在Python中是否存在?

时间:2018-10-16 13:26:16

标签: python python-3.x python-2.7

第一个代码段:

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()

它打印getatrrNone,这意味着属性__dict__不存在。

为什么在第一种情况下__dict__ {}在第二种情况下为何None

1 个答案:

答案 0 :(得分:1)

问题在于,当您定义以下内容时:

def __getattribute__(self, name):
    print("getatrr")

您要覆盖__getattribute__,而该{应该返回 。由于您未返回任何内容,因此您尝试使用的每个属性都会获得None

Documentation状态:

  

此方法应返回(计算出的)属性值或引发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__完成的。