返回介绍

用类方法统计实例

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

有趣的是,类方法也可以做类似的工作——如下代码与前面列出的静态方法版本具有相同的行为,但是,它使用一个类方法来把实例的类接收到其第一个参数中。类方法使用通用的自动传递类对象,而不是硬编码类名称:

这个类与前面的版本使用方式相同,但是通过类和实例调用printNumInstances方法的时候,它接受类而不是实例:

当使用类方法的时候,别忘了,它们接收调用的主体的最具体(低层)的类。当试图通过传入类更行类数据的时候,这具有某些细微的隐藏含义。例如,如果在模块test.py中我们像前面那样对定制子类化,扩展Spam.printNumInstances以显示其cls参数,并且开始一个新的测试会话:

无论何时运行一个类方法的时候,最低层的类传入,即便对于没有自己的类方法的子类:

这里的第一个调用中,通过Sub子类的一个实例调用了一个类方法,并且Python传递了最低的类,Sub,给该类方法。在这个例子中,由于该方法的Sub重定义显式地调用了Spam超类的版本,S pam中的超类方法在第一个参数中接收自己。但是,对于直接继承类方法的一个对象,看看发生了什么:

这里的最后一个调用把Other传递给了Spam的类方法。这在这个例子中也有效,因为它通过继承获取了在S pam中找到的计数器。如果该方法试图把传递的类的数据赋值,它将更新Object,而不是Spam。在这个特定的例子中,可能Spam通过直接编写自己的类名来更新其数据会更好,而不是依赖于传入的类参数。

使用类方法统计每个类的实例

实际上,由于类方法总是接收一个实例树中的最低类:

·静态方法和显式类名称可能对于处理一个类本地的数据来说是更好的解决方案。

·类方法可能更适合处理对层级中的每个类不同的数据。

代码需要管理每个类实例计数器,这可能会更好地利用类方法。在下面的代码中,顶层的超类使用一个类方法来管理状态信息,该信息根据树中的每个类都不同,而且存储在类上——这类似于实例方法管理类实例中状态信息的方式:

静态方法和类方法都有其他高级的作用,我们将在这里略过,请参见其他资源了解更多的使用示例。在最近的Python版本中,随着装饰语法的出现,静态方法和类方法的设计都变得更加简单——装饰语法是把一个函数应用于另一个函数的一种方法,该语法比它所激励的静态方法的使用具有更好的用途。这一语法允许我们在Python 2.6和Python 3.0中扩展类,以初始化最后一个示例中numInstances这样的计数器的数据。下一小节说明了如何做到这点。

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

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

发布评论

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