理解Python中的类和实例对象的命名空间字典

我们知道。模块可以通过内建属性_ _dict_ _显示模块的命名空间,实例和对象也存在同样的属性。

>>> class Namespace():
...     def function(self):
...             self.name = 'linuxer'
... 
>>> example = Namespace()
>>> example.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Namespace instance has no attribute 'name'
>>> 
>>> example.__dict__
{}
>>> example.function()
>>> example.name
'linuxer'
>>> example.__dict__
{'name': 'linuxer'}
>>>

在上面的交互模式会话中,创建了一个类Namespace,实例化一个实例example,当我尝试访问实例的name属性时,发现不能正常访问,报 属性错误:Namespace的实例没有name这个属性。这个时候通过访问实例的__dict__属性,发现这个字典什么内容也没有,这是为什么呢?原因在于self.name虽然是实例的属性,但是他是一个方法内部的变量,而在我们没有调用这个方法之前,他是不会存在于内存中的,只有当实例调用这个方法之后,才会存在于内存中,我们可以用id()证明这一点:

>>> test = Namespace()
>>> id(test.name)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Namespace instance has no attribute 'name'
>>> test.function()
>>> id(test.name)
140169321568464
>>>

从上面的会话中,我们可以看到,调用前,使用id(),会出现错误提示,调用之后,再使用id(),会出现一串数字,这个就是name属性在内存中的地址!因此,我们可以判断:方法或函数未调用之前,他们是不会存在于内存中的,包括方法中的其他变量。方法调用之后,我们再使用example.__dict__之后,就可以看到字典中有内容存在,并且是属性与其值的对应。

再看一个交互会话:

>>> Namespace.__dict__
{'function': <function function at 0x7f7bb69e96e0>, '__module__': '__main__', '__doc__': None}
>>> 
>>> Namespace.value = 'LinuxerRocky'
>>> Namespace.__dict__
{'function': <function function at 0x7f7bb69e96e0>, '__module__': '__main__', '__doc__': None, 'value': 'LinuxerRocky'}



example实例查看命令空间字典后,已经存在了数据。此时,我们再访问类Namespace的命名空间字典,发现没有name属性。然后我们用创建一个类属性value,再查看__dict__属性,发现存在了类的命名空间字典中存在了value属性。在这里额,可以得出另一个结论:属性是位于实例的属性命名空间字典中的。而不是类的空间命名字典中。


你可能感兴趣的:(python,类与实例的命名空间字典)