返回介绍

类陷阱

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

大多数类的问题通常都可以浓缩为命名空间的问题(这是有道理的,因为类只是多了一些技巧的命名空间而已)。本节所谈的有些问题更像是高级类的用法研究,而不是问题,而其中有一两个陷阱已随着最新Python版本的发布而改进了。

修改类属性的副作用

从理论的角度讲,类(和类实例)是可改变的对象。就像内置列表和字典一样,可以给类属性赋值,并且进行在原处的修改,同时意味着修改类或实例对象,也会影响对它的多处引用。

这通常就是我们想要的(也是对象一般修改其状态的方式),修改类属性时,了解这一点特别重要。因为所有从类产生的实例都共享这个类的命名空间,任何在类层次所做的修改都会反映在所有实例中,除非实例拥有自己的被修改的类属性版本。

因为类、模块以及实例都只是属性命名空间内的对象,一般可通过赋值语句在运行时修改它们的属性。在类主体中,对变量名a的赋值语句会产生属性X.a,在运行时存在于类的对象内,而且会由所有X的实例继承。

到目前为止,都不错,这是正常的情况。但注意到,当我们在class语句外动态修改类属性时,将发生什么事情:这也会修改每个对象从该类继承而来的这个属性。再者,在这个进程或程序执行时,由类所创建的新实例会得到这个动态设置值,无论该类的源代码是怎样的情况。

这是有用的功能还是危险的陷阱?自己判断。我们在第26章已经学习过,可以修改类的属性而不修改实例,就可以达到相同的目的。这种技术可以模拟其他语言的“记录”或“结构体”(struct)。考虑下面的不常见但是合法的Python程序。

在这里,类X和Y就像“无文件”模块:储存我们不想发生冲突的变量的命名空间。这是完全合法的Python程序设计技巧,但是使用其他人编写的类就不合适了。你永远无法知道,修改的类属性会不会对类内部行为产生重要影响。如果你要仿真C的结构体,最好是修改实例而不是类,这样的话,只有影响一个对象。

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

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

发布评论

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