您的位置:首页 > 编程语言 > Python开发

python 命名空间字典 字典键 继承树的打印

2014-12-13 18:59 381 查看

python 命名空间字典

模块的命名空间实际上是以字典的形式实现的,并且可以由内置属性__dict__显示这一点,类和实例对象也是如此:属性点号运算其实内部就是字典的索引运算,而属性继承其实就是搜索联结的字典而已,实例和类对象都是Python带有链接的字典

#space.py

>>> class super:
def hello(self):
self.data1='spam'
>>> class sub(super):
def hola(self):
self.data2='egg'
>>> X=sub()
>>> X.__dict__
{}
>>> X.__class__
<class __main__.sub at 0x01F85DF8>
>>> sub.__bases__
(<class __main__.super at 0x01F85D88>,)
>>> super.__bases__
()

>>> 解释:

制作子类的实例时,该实例一开始回事空的命名空间字典,但是有链接会指向它的类,让继承搜索能顺着寻找,实际上,继承树可在特殊的属性中看到,实例中有个__class__属性连接到了它的类,而类有个__bases__属性,是一个元组,其中包含了通往更高的超类的链接

#space.py continue

>>> Y=sub()
>>> X.hello()
>>> X.__dict__
{'data1': 'spam'}
>>> X.hola()
>>> X.__dict__
{'data1': 'spam', 'data2': 'egg'}
>>> sub.__dict__
{'__module__': '__main__', '__doc__': None, 'hola': <function hola at 0x01F8CF70>}
>>> super.__dict__
{'__module__': '__main__', 'hello': <function hello at 0x01F8CF30>, '__doc__': None}

>>> sub.__dict__.keys(),super.__dict__.keys()
(['__module__', '__doc__', 'hola'], ['__module__', 'hello', '__doc__'])
>>> Y.__dict__
>>>
{}

>>>>>>解释

当类为self属性赋值时,会填入实例对象,也就说属性最后会位于实例的属性命名空间字典内,而不是类的。实例对象的命名空间保存了数据,会随实例的不同而不同,而self正式进入其命名空间的钩子

类字典内的其他含有下划线变量名。Python会自动设置这些变量
每个实例都有独立的命名空间字典

因为属性实际是Python的字典键,那么有两种方式可以读取并对其进行赋值,通过点号运算或者通过键索引运算

>>> X.data1,X.__dict__['data1']
('spam', 'spam')
>>> X.data3='totast'
>>> X.__dict__
{'data1': 'spam', 'data3': 'totast', 'data2': 'egg'}
>>> X.__dict__['data4']='fasdfsa'
>>> X.__dict__
{'data4': 'fasdfsa', 'data1': 'spam', 'data3': 'totast', 'data2': 'egg'}

例子:打印继承体系中类名

#classtree.py
def selftest():
class A:pass
class B(A):pass
class C(A):pass
class D(B,C):pass
class E:pass
class F(D,E):pass
instancetree(B())
instancetree(F())

if __name__=='__main__':
selftest()

程序运行结果:

Tree of <__main__.B instance at 0x01EB29B8>
... B
...... A
Tree of <__main__.F instance at 0x01EB29B8>
... F
...... D
......... B
............ A
......... C
............ A
...... E
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: