返回介绍

第24章 高级模块话题

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

本章以一些更高级的模块相关话题作为第五部分的结尾:数据隐藏、__future__模块、__name__变量、sys.path修改、列表工具、通过名称字符串来运行模块、过渡式重载等,此外还有本书这一部分所提到的相关陷阱和练习题。

在本章中,我们将构建一些比目前所见到的要更大和更有用的工具,它们组合了函数和模块。和函数一样,当模块接口定义良好时,它们要更有效率一些,因此,本章也简单地回顾了模块设计概念,其中的一些概念我们在之前的各章中已经介绍过。

尽管本章标题有“高级”二字﹐这是因为本章混合了一些额外的模块话题。这里所讨论的有些话题(例如,__name__技巧)都得到了广泛使用,所以,在学习本书下一部分内容(类)之前,要确定学过了这些内容。

在模块中隐藏数据

正如我们所见到过的,Python模块会导出其文件顶层所赋值的所有变量名。没有对某一个变量名进行声明,使其在模块内可见或不可见这种概念。实际上,如果客户想的话,是没有防止客户端修改模块内变量名的办法的。

在Python中,模块内的数据隐藏是一种惯例,而不是一种语法约束。的确可以通过破坏模块名称使这个模块不能工作,但值得庆幸的是,我们还没遇到过这种程序员。有些纯粹主义者对Python资料隐藏采取的这种开放态度不以为然,并宣称这表明Python无法实现封装。然而,Python的封装更像是打包,而不是约束。

最小化from*的破坏:_X和__all__

有种特定的情况,把下划线放在变量名前面(例如,_X),可以防止客户端使from*语句导入模块名时,把其中的那些变量名复制出去。这其实是为了对命名空间的破坏最小化而已。因为from*会把所有变量名复制出去,导入者可能得到超出它所需的部分(包括会覆盖导入者内的变量名的变量名)。下划线不是“私有”声明:你还是可以使用其他导入形式看见并修改这类变量名。例如,使用import语句。

此外,也可以在模块顶层把变量名的字符串列表赋值给变量__all__,以达到类似于_X命名惯例的隐藏效果。例如:

使用此功能时,from*语句只会把列在__all__列表中的这些变量名复制出来。事实上,这和_X惯例相反:__all__是指出要复制的变量名,而_X是指出不被复制的变量名。Python会先寻找模块内的__all__列表;如果没有定义的话,from*就会复制出开头没有单下划线的所有变量名。

就像_X惯例一样,__all__列表只对from*语句这种形式有效,它并不是私有声明。模块编写者可以使用任何一种技巧实现模块,在碰上from*时,能良好地运行(参考第23章中有关包__init__.py文件内__all__列表的讨论,那些列表中声明了由from*所加载的子模块)。

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

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

发布评论

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