写点什么

Python 进阶丨如何创建你的第一个 Python 元类?

发布于: 2021 年 02 月 08 日

摘要:通过本文,将深入讨论 Python 元类,其属性,如何以及何时在 Python 中使用元类。


Python 元类设置类的行为和规则。元类有助于修改类的实例,并且相当复杂,是 Python 编程的高级功能之一。通过本文,将深入讨论 Python 元类,其属性,如何以及何时在 Python 中使用元类。本文介绍以下概念:


  • 什么是 Python 元类?

  • Python 中的类和对象

  • Python 中的动态类

  • Python 元类如何工作?


  1. 类型类

  2. Python 中的自定义元类


  • 装饰器 vs 元类


什么是 Python 元类?


Python 元类是与 Python 的面向对象编程概念相关的高级功能之一。它确定类的行为,并进一步帮助其修改。



用 Python 创建的每个类都有一个基础的 Metaclass。因此,在创建类时,您将间接使用元类。它隐式发生,您无需指定任何内容。


与元编程相关联的元类决定了程序对其自身进行操作的能力。 学习元类可能看起来很复杂,但是让我们先从一些类和对象的概念入手,以便于理解。


Python 中的类和对象


类是一个蓝图,是具有对象的逻辑实体。 一个简单的类在声明时没有分配任何内存,它是在创建一个类的实例时发生的。


通过创建的对象,可以访问该类。该类仅用作模板。对象的属性本质上意味着我们可以在运行时与它进行交互,传递诸如变量之类的参数,进行存储,修改,也可以与它进行交互。


可以使用__class__属性检查对象的类。让我们看一个简单的例子:



Output: <class '__main__.Demo'>


Python 大量处理类和对象的概念,并允许轻松,顺利地进行应用程序开发。但是,什么使 Python 与 Java 和 C 这样的语言不同呢?Python 中的所有内容都可以定义为具有属性和方法的对象。 主题演讲是 Python 中的类不过是更大类的另一个对象。



类为对象定义规则。同样,元类负责为类分配行为。我们已经知道,类是对象,就像每个对象都有一个实例一样,类是元类的实例。


但是也有像 Ruby 和 Objective-C 这样的语言也支持元类。那么,是什么使 Python Metaclass 更好,为什么还要学习它呢?答案是 Python 中的动态类。让我们仔细看看。


Python 中的动态类


Python 是一种动态编程语言,并允许在运行时创建类。与 C ++等其他语言不同,后者仅允许在编译时创建类。在灵活性方面,Python 优于其他静态类型的语言。


动态和静态类型语言之间的差异并不大, 但是在 Python 中,它由于提供元编程而变得更加有用。


但是,如果我告诉您还有另一个关键功能将 Python 与其他编程语言区分开呢?


诸如 Java 或 C ++之类的语言具有 float,char,int 等数据类型,而 Python 将每个变量视为对象。每个对象都属于一个类,例如 int 类或 str 类。您可以使用称为 type()的内置函数来简单地检查任何变量的类



Output:


Type associated is: <class 'int'>


Type associated is: <class 'str'>


现在,您了解了 Python 中的所有内容都有与之关联的类型。在下一个主题中,我们将尝试了解元类实际上是如何工作的。


Python 元类如何工作?


每当创建一个类时,都会调用默认的 Metaclass 类型。 元类包含名称,基类集以及与该类关联的属性等信息。因此,在实例化一个类时,将调用带有这些参数的类。可以通过两种方法创建元类:


  1. 类型类

  2. 自定义元类


让我们继续输入 class 以及如何创建 class。


类型类


Python 有一个称为 type 的内置元类。与 Java 或 C 不同,那里有主要的数据类型。Python 中的每个变量或对象都有一个与之关联的类。Python 使用幕后的 Type 类创建所有类。在上一个主题中,我们看到了如何使用 type()检查对象的类。让我们举一个例子,说明如何通过创建一个简单的类来定义新类型。



Output: <class '__main__.Edureka'>



Output: <class 'type'>


在上面的代码中,我们有一个名为 Edureka 的类,以及一个关联的对象。我们通过简单地在该类型之后创建一个名为自身的类,创建了一个名为 Edureka 的新类型。在第二个代码中,当我们检查 Edureka 类的类型时,其结果为“类型”。


因此,除非另有定义,否则元类使用类型类来创建所有其他类。我们可以通过两种方法访问 Type 类:



当我们通过类型类传递参数时,它使用以下语法。



  • 名称是一个字符串,并带有类名

  • 该基础是一个元组,可帮助创建子类

  • 属性是字典,并分配键值对


由于 Python 中的类的行为与对象相似,因此可以用相同的方式更改其行为。我们可以在类内添加或删除方法,类似于对对象的处理方式。


现在您已经知道 Metaclass 在 Python 中创建了所有其他类,并使用类型 class 定义了它们的行为。但是,您一定想知道,我们还有其他方法可以创建元类吗?因此,让我们看看如何创建一个自定义的元类。


Python 中的自定义元类


现在我们知道并理解类型类如何工作。现在该学习如何创建自定义元类了。我们可以通过执行动作或代码注入来修改类的工作。为此,我们可以在创建类定义时将 Metaclass 作为关键字传递。另外,我们可以通过简单地继承通过此 Metaclass 关键字实例化的类来实现此目的。


在创建新类时,Python 查找 metaclass 关键字。以防万一,如果不存在。它遵循类型类层次结构。



Python 在命名空间中执行所有字典后,将调用类型对象,后者创建类的对象。我们可以使用两种方法来创建自定义元类。




让我详细解释这两种方法:


  1. new (): 当用户要在类创建之前定义元组字典时使用。它返回一个类的实例,并且很容易覆盖/管理对象流。

  2. init ():在创建对象并对其进行初始化之后调用它。


Python 中的__call__是什么?


在正式的 Python 文档中,call 方法可用于定义自定义元类。同样,当调用类定义自定义行为时,我们可以覆盖__prepare__之类的其他方法。


就像类如何像创建对象的模板一样,元类也像类创建模板一样。因此,元类也称为类工厂。


请参见下一个示例:



Output: 200


元类允许自定义类。还有多种其他有效且简单得多的方法可以通过这些方法实现相同的输出。这样的例子之一就是使用装饰器。


装饰器 vs 元类


Decorator 是 Python 的一项流行功能,它允许您向代码中添加更多功能。装饰器是可调用的对象,可帮助修改现有的类甚至函数。在编译期间,部分代码将调用并修改另一部分。此过程也称为元编程。




Output: 200


Python 中的 Decorator 是一个非常有用且功能强大的工具,可帮助您更改函数的行为,而无需实际更改任何代码。 当您要在调试时修改程序的一部分而不是重写函数或更改整个程序时,这非常方便。取而代之的是,您只需编写一个单行装饰器,其余的就由它来处理。


本文分享自华为云社区《如何创建您的第一个 Python 元类?》,原文作者:Yuchuan。  


点击关注,第一时间了解华为云新鲜技术~


发布于: 2021 年 02 月 08 日阅读数: 21
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
Python进阶丨如何创建你的第一个Python元类?