8.2.3.4 属性引用与名字引用
属性引用实质上也是一种名字引用,其本质都是到名字空间中去查找一个名字所引用的对象。但是属性引用可以视为一种特殊的名字引用,它不受LEGB 规则的制约。这不是说它功能更强大了,而是说它的功能更弱了。在属性引用时,一定会有对象存在,而属性引用就是到对象的名字空间中去查找名字,这里没有嵌套的作用域,它所要遵循的规则比名字引用所要遵循的LEGB 规则简单多了。属性引用肚里可没那么多花花肠子,还要到什么外围去查找,不用了,有就是有,没有就是没有,简单明了。通常在一个Python 程序中会同时存在属性引用和名字引用,下面的例子标出了这些不同的引用:
import sys |
在8.2.1 节中提到,module 为Python 应用程序划分了名字空间,通过属性引用,我们就可以访问各个独立名字空间中的名字;而通过名字引用,我们可以访问本module 内部定义的多个嵌套的名字空间(作用域)。这两种方式的结合使我们能访问任何一个名字空间,但是它们的结合也给初识Python 的人带来相当的惊奇体验。看代码清单8-3 的例子。
代码清单8-3
[module1.py] |
在代码清单8-3 的[1]处,发生了两次引用:首先,Python 通过名字引用获得了名字module2 对应的module 对象;然后,Python 通过属性引用获得了module2 对应的module对象中的名字show_owner 对应的函数对象。在调用函数的过程中,Python 的执行流程到达代码清单8-3 的[2]时,发生了一次名字引用,寻找名字owner,由于名字引用是不能访问自身mudule 之外的名字空间,所以按照LEGB 规则,[2]处输出的结果是’module2’。尽管module1 中在调用show_owner 函数之前,在module1 的名字空间中引入了名字owner,但是这对module2 中的函数一点影响都没有,因为函数是在module2 中,而名字引用遵循的LEGB 的规则不会越过module 的边界。
那么有没有办法让show_owner 能输出module1 中的owner 信息呢?有的,通过函数参数,我们可以修改代码,如代码清单8-4 所示。
代码清单8-4
[module1.py] |
这次在代码清单8-4 的[2]处输出的结果就是“module1”了。有趣的是,[2]处还是一个名字引用,还是遵循着LEGB 规则。关键之处在于,函数的参数的传递机制是一种“拥有赋值行为”的动作。什么意思呢?也就是说,函数的参数也创建了一个约束,参数名将作为名字出现在函数的local 名字空间中(机理上可以这么理解,实际实现并非如此,参考函数机制一章),而其对应的对象则是从module1 中传递过来的module1. owner 对应的字符串对象。从而使LEGB 规则能够正确地引用到字符串对象“module1”。
这又是最内嵌套作用域规则的杰作,经过对那么多实例的研究探讨,我们可以发现,这条规则对于理解Python 的行为至关重要。正是这条规则,决定了Python 行为的更多是代码出现的位置,而非代码执行的时间。
作用域和名字空间概念和规则对于理解Python 的运行时行为非常关键,但是,之前我们就已经提到,它们只是用于指导Python 如何实现的“道”,Python 的源码中又是如何实现这些形而上的“道”的呢?这些都会在随后的章节中依次展开讨论。对于现在的我们来说,谈论这些是如何实现的还为时尚早,毕竟,我们现在还不知道Python 虚拟机是如何执行源文件编译后的字节码指令序列的。
| 回书目 上一节 下一节 |
|
||||
| · 无线路由器故障处理 · 解析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岁技术人的价值.. |
|||