Python - 元类



元类( Metaclasses )是 Python 中的一项强大功能,允许您自定义类创建。通过使用元类,您可以向类添加特定的行为、属性和方法,并允许您创建更灵活、更高效的程序。此类提供了在 Python 中使用元编程的能力。

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

在 Python 中创建元类

元类是类的类,它定义了类的行为方式。Python 中的每个类都是其元类的实例。默认情况下,Python 使用 type() 函数来构造元类。但是,您可以定义自己的元类来自定义类的创建和行为。

定义类时,如果未明确指定基类或元类,则 Python 使用 type() 构造类。然后它的主体在一个新的命名空间中执行,得到的类名在本地链接到 type(name, bases, namespace) 的输出。

让我们观察一下在不指定特定基类或元类的情况下创建类对象的结果


class Demo:
	 	pass
	 	
obj = Demo()

print(obj)

输出

在执行上述程序时,您将获得以下结果 -

<__main__.Demo object at 0x7fe78f43fe80>

此示例演示了使用元类在 Python 中进行元编程的基础知识。上述输出表明 obj Demo 类的实例,驻留在内存位置 0x7fe78f43fe80。这是 Python 元类的默认行为,允许我们轻松检查类的细节。

动态创建元类

Python 中的 type() 函数可用于动态创建类元类。

在此示例中,将使用 type() 函数创建 DemoClass,并且还会创建并显示该类的实例。


# Creating a class dynamically using type()
DemoClass = type('DemoClass', (), {})
obj = DemoClass()
print(obj)

输出

执行上述程序后,您将获得以下结果 -

<__main__.DemoClass object at 0x7f9ff6af3ee0>

这是另一个创建具有继承的 Metaclass 的示例,这可以通过使用 type() 函数从另一个类继承一个来完成。


class Demo:
	 	pass
	 	
Demo2 = type('Demo2', (Demo,), dict(attribute=10))
obj = Demo2()

print(obj.attribute)
print(obj.__class__)
print(obj.__class__.__bases__)

输出

以下是输出 -

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

自定义元类创建

在 Python 中,您可以通过定义自己的元类来自定义类的创建和初始化方式。此自定义对于各种元编程任务非常有用,例如向类的所有实例添加特定行为或跨多个类强制执行某些模式。

可以通过覆盖元类中的方法来自定义类,特别是 __new__ __init__

让我们看看演示如何使用 python 中元类的 __new__ 方法自定义类创建的示例。


# Define a custom metaclass
class MyMetaClass(type):
	 	def __new__(cls, name, bases, dct):
	 	 	 dct['version'] = 1.0
	 	 	 		
	 	 	 # Modify the class name
	 	 	 name = 'Custom' + name
	 	 	 		
	 	 	 return super().__new__(cls, name, bases, dct)

# MetaClass acts as a template for the custom metaclass
class Demo(metaclass=MyMetaClass):
	 	pass

# Instantiate the class
obj = Demo()

# Print the class name and version attribute
print("Class Name:", type(obj).__name__)
print("Version:", obj.version)

输出

在执行上述代码时,您将获得以下结果 -

Class Name: CustomDemo
Version: 1.0

这是另一个示例,演示如何使用 Python 中的 __init__ 自定义元类。


# Define a custom metaclass
class 2yCreating MetaClass(type):
	 	def __init__(cls, name, bases, dct):
	 	 	 print('Initializing class', name)
	 	 	 		
	 	 	 # Add a class-level attribute
	 	 	 cls.version= 10
	 	 		
	 	 	 super().__init__(name, bases, dct)

# Define a class using the custom metaclass
class MyClass(metaclass=MyMetaClass):
	 	def __init__(self, value):
	 	 	 self.value = value
	 		
	 	def display(self):
	 	 	 print(f"Value: {self.value}, Version: {self.__class__.version}")

# Instantiate the class and demonstrate its usage
obj = MyClass(42)
obj.display()

输出

在执行上述代码时,您将获得以下结果 -

Initializing class MyClass
Value: 42, Version: 10