8.2.2 约束与名字空间
在Python 中,赋值语句(更确切地说,是具有赋值行为的语句)是一类相当特殊的语句,原因很简单,它们会影响名字空间。在A.py 中,“a = 1”是一个赋值语句,它的作用是首先创建一个整数对象1,然后将这个对象“赋给”名字a。同样地“def f()”也是一个赋值语句,它的作用是首先创建一个函数对象(参见剖析函数机制的章节),然后将这个函数对象“赋给”名字f。
我们可以总结出Python 中赋值语句行为的共同之处:
创建一个对象obj
将obj“赋给”一个名字name
在Python 中,除了在A.py 中我们见到的赋值语句外,还有如“class A(object):”,“import abc”这样的语句都是赋值语句,都遵循赋值语句的行为。
在赋值语句被执行之后,从概念上讲,我们实际上得到了一个(name,obj)这样的关联关系,对于这个关联关系,我们采用《程序设计语言——实践之路》里的术语,将之称为约束。赋值语句就是约束建立的地方。在一个约束被创建之后,它不会立刻消失,相反,它会长久地影响程序的行为。约束的容身之处就是名字空间。在Python 中,名字空间就是一个PyDictObject 对象实现的。约束既然是(name,obj)这样的关联关系,那么PyDictObject 简直就是为它量身订做的。
回到我们的A.py,在一个module 被加载到Python 中之后,它在内存中以一个module对象(参见剖析module 实现的章节)的形式存在。在module 对象中,维护着一个名字空间(一个dict 对象)。而(a, 1)、(f, function object)这些约束就位于module 的名字空间中。
一个对象的名字空间中的所有名字都称为对象的属性。在前面,我们看到了Python中有一类“拥有赋值行为”的语句,从另一个角度来看,实际上它们也是“拥有设置对象属性的行为”的语句。既然设置了属性,那么Python 中还有一类“拥有访问对象属性的行为”的语句,我们将访问对象属性这个动作称之为“属性引用”。比如对于A.py,如果另一个B.py 中,有“import A”和“print A.a”两条语句,其中的“A.a”就是一个属性引用。属性引用就是使用另一个名字空间中的名字,一个module 定义了一个独立的名字空间,在另一个module 中,要使用别的module 中的名字,只能通过属性引用的方式访问别的module 的名字空间,获得名字对应的对象(注意,对于Python 中的class 和class对应的实例对象,也有类似的考量)。
在Python 中,module 之间的名字空间规则是很清晰的,但在module 内部,对名字空间的使用有着另一套不同的规则。
| 回书目 上一节 下一节 |
|
||||
| · 无线路由器故障处理 · 解析35岁技术人的价值.. · 无线重中之重:安全问题 · 无线局域网基本知识 · 家庭无线局域网 · 华为七千人主动辞职规.. · 微软出价446亿美元收购.. · 虚拟化的“赤壁之战” |
· Windows Server 2008专.. · 802.11n:下一代的无线.. · 脉冲无线电uwb专题 · AIX操作系统管理应用 · 云计算时代来临 · 求职必杀技 决战面试官 · 龙芯要做中国的“奔腾” · 2008年上半年IT技术图.. |
|||
|
||||
| · SOA 面向服务架构 · SQL Server 2008/2005.. · Apache技术专题 · 三层交换技术专题 · SQL Server入门到精通 · 无线网状网(MESH) · Windows远程桌面应用 · C#技术开发指南 |
· Apache技术专题 · Windows集群服务应用 · C#技术开发指南 · 文档格式标准开战 OOXM.. · 路由器设置与口令恢复 · Linux 集群技术专题 · PHP开发应用手册 · SOA 面向服务架构 |
|||
|
||||
| · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · Apache技术专题 · C#技术开发指南 · 三层交换技术专题 · Apache技术专题 · C#技术开发指南 |
· Windows远程桌面应用 · 企业数据恢复指南 · Windows集群服务应用 · 路由器设置与口令恢复 · Linux 集群技术专题 · SOA 面向服务架构 · 了解统一威胁管理(UTM).. · 解析35岁技术人的价值.. |
|||