什么是 Python 中的元类?

programmingpythonserver side programming

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

相关文章