返回介绍

命名空间的嵌套

发布于 2024-01-29 22:24:16 字数 1053 浏览 0 评论 0 收藏 0

就某种意义而言,虽然导入不会使命名空间发生向上的嵌套,但确实会发生向下的嵌套。利用属性的点号运算路径,有可能深入到任意嵌套的模块中并读取其属性。例如,考虑下列三个文件。mod3.py以赋值语句定义了一个全局变量名和属性:

接着,mod2.py定义本文件内的X,然后导入mod3,使用点号运算来取所导入的模块的属性。

mod1.py也定义本文件内的X,然后导入mod2,并取出第一和第二个文件内的属性。

实际上,当这里的mod1导入mod2时,会创建一个两层的命名空间的嵌套。利用mod2.mod3.X变量名路径,就可深入到所导入的mod2内嵌套了的mod3。结果就是mod1可以看见三个文件内的X,因此,可以读取这三个全局范围。

然而,反过来讲,就没这回事了:mod3无法看见mod2内的变量名,而mod2无法看见mod1内的变量名。如果你不以命名空间和作用域的观点思考,而是把焦点集中在牵涉到的对象,这个例子就会比较容易掌握。在mod1中,mod2只是变量名,引用带有属性的对象,而该对象的某些属性可能又引用其他带有属性的对象(import是赋值语句)。对于mod2.mod3.X这类路径而言,Python只会由左至右进行计算,沿着这样的路径取出对象的属性。

注意到:mod1可以说import mod2,然后mod2.mod3.X,但是,无法说import mod2.mod3。这个语法牵涉所谓的包(目录)导入,这将在下一章介绍。包导入也会形成模块命名空间嵌套,但是,其导入语句会反映目录树结构,而非简单的导入链。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文