返回介绍

示例:向类添加方法

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

在本节以及下一节,我们将学习两个常见的元类示例:向一个类添加方法,以及自动装饰所有的方法。这只是元类众多用处中的两个,它们将占用本章剩余的篇幅。再一次说明,你应该在Web上查找以了解更多的高级应用。这些示例代表了元类的应用,因此它们足以说明基础知识。

此外,这两个示例都给了我们机会来对比类装饰器和元类——第一个示例比较了类扩展和实例包装的基于元类和基于装饰器的实现;第二个实例首先对元类应用一个装饰器,然后应用另一个装饰器。你将会看到,这两个工具往往是可以交换的,甚至是互补的。

手动扩展

在本章前面,我们看到了以不同方法向类添加方法来扩展类的骨干代码。正如我们所见到的,如果在编写类的时候,静态地知道额外的方法,那么简单的基于类的继承已经足够了。通过对象嵌入的组合,往往也能够实现同样的效果。然而,对于更加动态的场景,有时候需要其他的技术,辅助函数通常足够了,但元类提供了一种更加明确的结构并且减少了未来修改的成本。

让我们在这里通过实际代码把这些思想付诸实践。考虑下面示例中的手动类扩展——它向两个类添加了两个方法,在创建了它们之后:

这是有效的,因为方法总是在类创建之后分配给一个类,只要分配的方法是带有一个额外的第一个参数以接收主体self示例的函数,这个参数可以用来访问类实例中可用的状态信息,即便函数独立于类定义。

当这段代码运行的时候,我们接收到在第一个类的代码中编写的一个方法输出,以及在此后添加到类中的两个方法的输出:

这种方法在独立的情况下工作得很好,并且可以在运行时任意地填充一个类。但它有一个潜在的主要缺点,对于需要这些方法的每个类,我们必须重复扩展代码。在我们的例子中,对两个类都添加两个方法还不是太繁琐,但是,在更为复杂的环境中,这种方法可能是耗时的而且容易出错。如果我们曾经忘记一致地这么做,或者我们需要修改扩展,就可能遇到问题。

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

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

发布评论

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