什么是 Python 中的元类?

programmingpythonserver side programming更新于 2025/3/23 2:20:17

Python 中的元编程被定义为程序影响自身的能力。它是通过使用 Python 中的元类来实现的。

Python 中的元类

元类是默认存在于所有 Python 代码中的 OOP 概念。Python 提供了使用关键字 type 创建自定义元类的功能。Type 是一个元类,其实例是类。在 Python 中创建的任何类都是元类类型的实例。

type() 函数可以动态创建类,因为调用 type() 会创建一个元类类型的新实例。

语法

使用 type() 创建类的语法如下 -

class name = type(⁢name>, ⁢bases>, ⁢dct>

其中,

<⁢name> 是类名

<⁢bases> 定义类将从中继承的基类元组

<⁢dct> 定义包含类定义的命名空间字典

示例 1

这是最简单的类定义因为 和 参数都为空,因此没有继承,并且命名空间字典为空。

DemoClass = type('DemoClass', (), {}) obj = DemoClass() print(obj)

输出

上述代码的输出给出了一个变量 DemoClass,该变量保存了对该类的引用。

<__main__.DemoClass 对象位于 0x7fde96524240>

示例 2

在下面的示例中,第二个参数是一个元组,其中包含一个元素 Demo,类 Demo2 从中继承。

class Demo: pass Demo2 = type('Demo2', (Demo,), dict(attribute=10)) obj = Demo2() print(obj.attribute) print(obj.__class__) print(obj.__class__.__bases__)

输出

在上述程序的输出中,打印属性会得到 10,因为它已存储在 参数中。打印类会得到 Demo2 作为输出,因为这是派生类,打印基类会得到 Demo 作为结果,因为它存在于 参数中。

10
⁢class '__main__.Demo2'>
(⁢class '__main__.Demo'>,)

示例 3

在下面的示例中,<dct>  参数具有属性变量和 attribute_value,它们充当 Demo 类的方法。

Demo = type('Demo',(), { 'attribute': 10, 'attribute_value': lambda obj : obj.attribute } ) obj = Demo() print(obj.attribute) print(obj.attribute_value())

输出

上述程序为两个实例赋予了 10 的值,因为 中的属性值已被赋予 10,而 attribute_value 是一种调用属性变量的方法,该变量的赋值为 10。

10
10

示例 4

在下面的示例中,将外部创建的函数分配给 <dct>  参数中的 attribute_value,以替换 lambda,因为 lambda 只能执行简单任务。

def s(obj): print('Attribute value =', obj.attribute) Demo = type('Demo',(), { 'attribute': 10, 'attribute_value': s } ) object = Demo() print(object.attribute) object.attribute_value()

输出

输出再次为 attribute 和 attribute_value 给出 10。由于 attribute 变量的值为 10,因此当调用 attribute_value 时,它​​会获取 s,即外部分配的函数。然后程序执行函数 s,该函数运行 attribute_value 的打印语句。

10
Attribute value = 10

Python 中的自定义元类

Python 允许通过在创建新类时将类型作为参数传递来创建自定义元类。元类也称为类工厂,因为它们可以用作创建类的模板。

创建自定义元类的示例

在此示例中,MetaClass 是一个自定义元类,因为它继承自 type,而 type 本身就是一个元类。这允许创建 __new__(),它执行以下操作 -

  • 通过 super() 调用父元类类型来创建新类
  • 为类创建自定义属性
  • 返回创建的类<​​/li>

MetaClass 可以作为创建 CustomClass 的模板,因此 CustomClass 继承了 MetaClass 的属性。

示例

以下是创建自定义元类的示例 -

class MetaClass(type): def __new__(self,name,base,dct): obj = super().__new__(self,name,base,dct) obj.attribute = 10 return obj # MetaClass acts as template for CustomClass class CustomClass(metaclass = MetaClass): pass print(CustomClass.attribute)

输出

以下是上述代码的输出−

10

相关文章


有用资源