返回介绍

实例与继承的关系

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

由于元类以类似于继承超类的方式来制定,因此它们乍看上去有点容易令人混淆。一些关键点有助于概括和澄清这一模型:

·元类继承自type类。尽管它们有一种特殊的角色元类,但元类是用class语句编写的,并且遵从Python中有用的OOP模型。例如,就像type的子类一样,它们可以重新定义type对象的方法,需要的时候重载或定制它们。元类通常重新定义type类的__new__和__init__,以定制类创建和初始化,但是,如果它们希望直接捕获类末尾的创建调用的话,它们也可以重新定义__call__。尽管元类不常见,它们甚至是返回任意对象而不是type子类的简单函数。

·元类声明由子类继承。在用户定义的类中,metaclass=M声明由该类的子类继承,因此,对于在超类链中继承了这一声明的每个类的构建,该元类都将运行。

·元类属性没有由类实例继承。元类声明指定了一个实例关系,它和继承不同。由于类是元类的实例,所以元类中定义的行为应用于类,而不是类随后的实例。实例从它们的类和超类获取行为,但是,不是从任何元类获取行为。从技术上讲,实例属性查找通常只是搜索实例及其所有类的__dict__字典;元类不包含在实例查找中。

为了说明最后两点,考虑如下的例子:

当这段代码运行的时候,元类处理两个客户类的构建,并且实例继承类属性而不是元类属性:

尽管细节很有意义,但是,在处理元类的时候,头脑中保持大概念很重要。像我们已经在这里见到的元类将会对声明它们的每个子类自动运行。和我们在前面见到的辅助函数方法不同,这样的类将会自动获取元类所提供的任何扩展。此外,修改这样的扩展只需要在一个地方编码——元类中,这简化了所需要进行的修改。就像Python中如此众多的工具一样,元类通过除去冗余简化了维护工作。然而,要完全展示其功能,我们需要继续看一些更大的示例。

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

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

发布评论

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