命名空间字典

我们学到了模块的命名空间实际上是以字典的形式实现的,并且可以由内置属性__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. Vue简单项目(页面跳转,参数传递)

    一.页面跳转 1.和上篇文章一样的建文件的步骤 2.建立成功之后,在src文件夹下面添加新的文件夹pages 3.在pages里面添加新的文件Home.Vue和Detail.Vue 4.设Home.V ...

  2. redis和memcache

    redis安装:($sudo apt-get update,$sudo apt-get install redis-server) redis启动:($redis-server): 查看redis是否 ...

  3. hdoj薛猫猫杯程序设计网络赛1003 球球大作战

    思路: 二分,check函数不是很好写. 实现: 1. #include <bits/stdc++.h> using namespace std; typedef long long ll ...

  4. Jenkins结合ant传递参数

    需求: 使用Jenkins的「参数化构建过程」,由用户手动输入参数.通过ant脚本接收这个参数,并输出(当然,中间也可以进行复杂的处理,这里为了说明问题,仅做简单的输出). 1.基础环境 Jenkin ...

  5. Spring 配置定时器(注解+xml)方式—整理

    一.注解方式 1. 在Spring的配置文件ApplicationContext.xml,首先添加命名空间 xmlns:task="http://www.springframework.or ...

  6. COGS 2211. [BZOJ3653]谈笑风生

    ★★★★   输入文件:laugh.in   输出文件:laugh.out   简单对比时间限制:3 s   内存限制:512 MB [问题描述] 设T 为一棵有根树,我们做如下的定义: • 设a和b ...

  7. COFF文件格式

    链接器 目录 一 COFF-Common Object File Format-通用对象文件格式... 3 COFF的文件格式与结构体... 4 文件头... 5 numberOfSections(区 ...

  8. HDU 6041 I Curse Myself(点双联通加集合合并求前K大) 2017多校第一场

    题意: 给出一个仙人掌图,然后求他的前K小生成树. 思路: 先给出官方题解 由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉.所以问题就变为有 M 个集合,每个集合里面都有一堆 ...

  9. javaEE(8)_EL表达式语言

    一.EL表达式简介 EL全名为Expression Language.EL主要作用: 1>获取数据: •EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域中检索java对象. ...

  10. Clover KextsToPatch 使用方法 2015.10.21

    Clover KextsToPatch 使用方法 2015.10.21   前些天,因为 Thinkpad X230 BIOS 白名单限制,给她换了一块 ar9285 无线网卡,只是因为这块网卡正好可 ...