什么是 Python 中的元类?
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
在下面的示例中,第二个参数
class Demo: pass Demo2 = type('Demo2', (Demo,), dict(attribute=10)) obj = Demo2() print(obj.attribute) print(obj.__class__) print(obj.__class__.__bases__)
输出
在上述程序的输出中,打印属性会得到 10,因为它已存储在
10 class '__main__.Demo2'> (class '__main__.Demo'>,)
示例 3
在下面的示例中,<dct>
Demo = type('Demo',(), { 'attribute': 10, 'attribute_value': lambda obj : obj.attribute } ) obj = Demo() print(obj.attribute) print(obj.attribute_value())
输出
上述程序为两个实例赋予了 10 的值,因为
10 10
示例 4
在下面的示例中,将外部创建的函数分配给 <dct>
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