博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python3--命名空间字典
阅读量:5173 次
发布时间:2019-06-13

本文共 2169 字,大约阅读时间需要 7 分钟。

命名空间字典

我们学到了模块的命名空间实际上是以字典的形式实现的,并且可以由内置属性__dict__显示这一点。类和实例对象也是如此:属性点号运算其实内部就是字典的索引运算,而属性继承其实就是搜索连结的字典而已。实际上,实例和类对象就是Python中带有链接的字典而已。Python揭露这些字典,还有字典间的链接,以便于在高级角色中使用(例如,编码工具)。

为了了解Python内部属性的工作方式,我们通过交互模式会话加入类,来跟踪命名空间字典的增长的方式。首先,我们定义二个超类和子类,而它们的方法会在实例中保存数据。

当我们制作子类的实例时,该实例一开始会是空的命名空间字典,但是有链接会指向它的类,让继承搜索能顺着寻找。实际上,继承树可在特殊的属性中看到,:你可以进行查看。实例中有个Class属性连结到了它的类,而类有个bases属性,是一个元组,其中包含了通往更高的超类的链接。

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

注意:类字典内的其他含有下划线变量名.Python会自动设置这些变量,它们中的大多数都不会在一般程序中使用到,但是有些工具会使用其中的一些变量(例如,__doc__控制讨论过的的文档字符串)。

此外,Y是这些语句中创建的第二个实例,即使X的字典已由方法内的赋值语句做了填充,Y最后还是个空的命名空间字典。同样地,每个实例都有独立的命名空间字典,一开始是空的,可以记录和相同类的其他实例命名空间字典中的属性,完全不同的属性。因为属性实际上是Python的字典键,其实有两种方式可以读取并对其进行赋值:通过点号运算或者通过键索引运算。

不过,这种等效关系只适用于实际中附加在实例上的属性。因为属性点号运算也会执行继承搜索,所以可以存取命名空间字典索引运算无法读取的属性。例如,继承的属性X.hello无法由X.__dict__['hello']读取.

最后,下面是介绍过的内置函数dir用在类和实例对象上的情况。这个函数能用在任何带有属性的对象上:dir(objeot)类似于object.__dict__.keys()调用。不过,dir会排序其列表并引入一些系统属性。在Python2.2中,d!r也会自动收集继承的属性。

亲自动手实验一下这些特殊的属性,来了解命名空间实际上怎么处理它们储存的属性的。即使你绝不会在程序内使用这些特殊属性,但是知道它们只是普通的字典,也有助于弄清楚命名空间的一般概念。

#!/usr/bin/env python# -*- coding:utf-8 -*-class Supper:    def hello(self):        self.data1 = "spam"class Sub(Supper):    def hola(self):        self.data2 = "eggs"x = Sub()print(x.__dict__)print(x.__class__)print(Sub.__bases__)print(Supper.__bases__)print("----------------------------------")y = Sub()x.hello()print(x.__dict__)x.hola()print(x.__dict__)print(Sub.__dict__)print(Supper.__dict__)print("----------------------------------")print(Sub.__dict__.keys(), Supper.__dict__.keys())print(y.__dict__)

运行结果:

{}
(
,)(
,)----------------------------------{'data1': 'spam'}{'data1': 'spam', 'data2': 'eggs'}{'__module__': '__main__', 'hola':
, '__doc__': None}{'__module__': '__main__', 'hello':
, '__dict__':
, '__weakref__':
, '__doc__': None}----------------------------------dict_keys(['__module__', 'hola', '__doc__']) dict_keys(['__module__', 'hello', '__dict__', '__weakref__', '__doc__']){}

 

转载于:https://www.cnblogs.com/chenlin163/p/7307542.html

你可能感兴趣的文章
十进制 转换成 二进制
查看>>
钻石操作符
查看>>
[LeetCode 题解]: Minimum Depth of Binary Tree
查看>>
LoadRunner脚本增强
查看>>
python集成安装环境——Anaconda 3.5的安装
查看>>
斐波那契数列
查看>>
function(){} 与(function(){})()的区别
查看>>
作用域
查看>>
yii2高级模板安装
查看>>
ROS学习笔记(六)——创建、编译包
查看>>
SVN服务器搭建(一)
查看>>
js 控制台输出
查看>>
图像处理基础知识
查看>>
串行写队列的MYSQL大文本参数
查看>>
云平台服务运行情况检测脚本V0.1
查看>>
Elasticsearch: 权威指南---基础入门
查看>>
python selenium chrome有界面与无界面模式
查看>>
【Unity游戏开发】Android6.0以上的动态权限申请问题
查看>>
1040 有几个PAT(25 分)
查看>>
1033 旧键盘打字(20 分)
查看>>