Python - 元类



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

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

在 Python 中创建元类

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

在定义类时,如果没有显式指定基类或元类,则 Python 使用type()来构造类。然后在新的命名空间中执行其主体,生成的类名与type(name, bases, namespace)的输出在本地链接。

示例

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

class Demo:
   pass
   
obj = Demo()

print(obj)

输出

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

<__main__.Demo object at 0x7fe78f43fe80>

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

动态创建元类

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

示例

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

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

输出

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

<__main__.DemoClass object at 0x7f9ff6af3ee0>

示例

这是另一个使用继承创建元类的示例,可以通过使用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
广告