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
廣告