命名空间字典

我们学到了模块的命名空间实际上是以字典的形式实现的,并且可以由内置属性__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__)

运行结果:

{}
<class '__main__.Sub'>
(<class '__main__.Supper'>,)
(<class 'object'>,)
----------------------------------
{'data1': 'spam'}
{'data1': 'spam', 'data2': 'eggs'}
{'__module__': '__main__', 'hola': <function Sub.hola at 0x00000000022FFD08>, '__doc__': None}
{'__module__': '__main__', 'hello': <function Supper.hello at 0x00000000022FFC80>, '__dict__': <attribute '__dict__' of 'Supper' objects>, '__weakref__': <attribute '__weakref__' of 'Supper' objects>, '__doc__': None}
----------------------------------
dict_keys(['__module__', 'hola', '__doc__']) dict_keys(['__module__', 'hello', '__dict__', '__weakref__', '__doc__'])
{}

python3--命名空间字典的更多相关文章

  1. [Python3] 017 字典的内置方法

    目录 1. Python3 中如何查看 dict() 的内置方法 2. 少废话,上例子 (1) 清理大师 clear() (2) 拷贝君 copy() (3) get(key, default=Non ...

  2. [Python3] 016 字典:给我一块硬盘,我可以写尽天下!

    目录 0 字典的独白 1 字典的创建 2 字典的特性 3 字典的常见操作 (1) 数据的访问.更改与删除 (2) 成员检测 (3) 遍历 4 字典生成式 5 字典的内置方法 6 可供字典使用的其它方法 ...

  3. 吴裕雄--天生自然python学习笔记:Python3 命名空间和作用域

    命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的. 命名空间提供了在项目中避免名字冲突的一种方法.各个命名空间是独立的,没有任何关系的,所以一个 ...

  4. python3判断字典、列表、元组为空以及字典是否存在某个key的方法

    #!/usr/bin/python3 #False,0,'',[],{},()都可以视为假 m1=[] m2={} m3=() m4={"name":1,"age&quo ...

  5. Python3 数据类型-字典

    字典是一种可变数据类型,且可存储任意类型对象. 字典使用大括号"{}"括起来,由键(key)和值(values)组成,键只能使用不可变类型定义,值可以使用可变类型{'键':'值'} ...

  6. python2和python3,字典和json

    Python2的标准数据类型有: Numbers (数字) String (字符串) List (列表) Tuple (元组) Dictionary (字典) Python3的标准数据类型有: Num ...

  7. 笔记||Python3之字典

    字典的定义与特性: 字典的每个键值key ==> value 对用冒号:分割,每个键值对之间用逗号分割,整个字典包括在花括号{}中. 字典名 = {键名1:值1, 键名2:值2} 如:dict ...

  8. python3中字典的copy

    字典是可变的: first和second同时指向一个字典.first修改也会影响second.在程序中一定注意对字典参数的修改会对原始的字典进行修改.这也体现了字典是可变的. 字典的copy方法是浅拷 ...

  9. python3 列表/字典/集合推导式

    '''列表推导式[结果 fox循环 if语句]'''lst = ["Python周末%s期" % i for i in range(1, 27) if i%2 == 0]print ...

  10. python3中字典的遍历和合并

    #字典的遍历方式 dic={"a":1,"b":2,"c":3} for k in dic: print (k,dic[k]) for k, ...

随机推荐

  1. MySql数据库的相关操作

    SQL(Structred Query Language)结构化查询语言:和数据库交互的语言,进行数据库管理的语言. 一.数据库的操作: 1.查询所有数据库: show databases; 2.创建 ...

  2. ARM指令解析

    今天我来总结一下arm指令的学习,今天我不会对所有的arm指令进行一一的解析,在这里希望大家去看arm汇编手册,这个手册的中文版我放在了http://download.csdn.net/detail/ ...

  3. HDU 3032 Nim or not Nim? (Nim,sg函数)

    题意:给出几堆石子数量,每次可以取走一堆中任意数量的石头,也可以将一堆分成两堆,而不取.最后取走者胜. 思路:石子数量很大,不能直接算,sg打表找出规律:正常情况下a[i]=i,但是有例外的,就是i% ...

  4. 洛谷 P2872 [USACO07DEC]道路建设Building Roads

    题目描述 Farmer John had just acquired several new farms! He wants to connect the farms with roads so th ...

  5. fluent_python2

    字典和集合 泛映射类型, 继承自collections.abc, Mapping和MutableMapping 标准库里的所有映射类型都是利用 dict 来实现的,因此它们有个共同的限制,即只有可散列 ...

  6. 汇编segment

    一个正常的应用程序被由若干个 segment组成. 定义 segment: SECTION .段名 SECTION 也可以小写 如: 定义数据段: section .data   定义代码段: sec ...

  7. PHP的PDF扩展库TCPDF将中文字体设置为内嵌字体的方法

    1. 下载要设置的字体,如名为simfang.ttf,放在./vendor/tecnickcom/tcpdf/tools目录中 2.在tools目录中按住shift,点击鼠标右键,点击“在此处打开命令 ...

  8. Bootstrap历练实例:小的按钮

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  9. JS数组专题2️⃣ ➖ 数组去重

    距离上次发文,已经有一段时间了,最近工作比较忙,这不眼看快双十一了,就相当于给大家一些福利吧! 一.什么是数组去重 简单说就是把数组中重复的项删除掉,你 GET 到了吗 ?下面我将简单介绍下几种基本的 ...

  10. js和JQuery中的获取宽、高、位置等方法整理

    1.获取当前窗口宽度区别(需要注意的是用的window还是document)JQuery:console.log($(window).width()); //获取窗口可视区域的宽度 console.l ...