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.pydef 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
相关文章推荐
- Python中将字典转换为XML以及相关的命名空间解析
- Python中将字典转换为XML以及相关的命名空间解析
- python 模块,类和全局函数---命名空间;继承和装饰器总结
- 飘逸的python - 保持命名空间的整洁
- Chapter 28.命名空间、多重继承和虚继承
- 积少成多Flash ActionScript 3.0(2) - 基础之包、类、包外类、命名空间、属性、方法、接口和继承
- AO开发打印相关接口及其命名空间
- 积少成多Flash ActionScript 3.0(2) - 基础之包、类、包外类、命名空间、属性、方法、接口和继承
- python命名空间与作用域
- C++ premier -- 异常、命名空间以及多重继承
- 《C++ Primer》 第17章 用于大型程序的工具 [ 异常处理,命名空间,多重继承与虚继承 ] (不够熟)
- python处理utf8编码中文,及打印中文列表和字典
- 利用 .NET Printing 命名空间从 Windows 窗体应用程序中进行预览和打印
- Python命名空间的本质
- python的命名空间
- python的命名空间和作用域
- Python 作用域和命名空间
- 新瓶旧酒ASP.NET AJAX(2) - 客户端脚本编程(命名空间、类、成员、接口、继承、枚举)
- extjs 中的命名空间、类方法、类继承等
- [C/C++] 第17章 用于大型程序的工具 [ 异常处理,命名空间,多重继承与虚继承 ] (不够熟) 《 C++ Primer 》