Python 中的元類

Rayven Esplanada 2021年8月10日
Python 中的元類

本教程將討論 Python 中物件導向上下文中的元類。

Python 中的元類

簡單地說,元類定義了類的行為。常規類定義物件或類的例項的行為方式。

在 Python 中,元類是預製的和隱式的;這意味著在建立類時在後臺建立了一個元類。

Python 中的 object 基類

在 Python 中,隱式建立的每個類都繼承了基類 object。在 object 類中有內建的私有方法,如 __init____new__。在一個類甚至開始建立自己的欄位、函式和屬性之前,它們都會繼承 object 類中的任何屬性。

例如,讓我們建立一個新類 ChildObject。在這個類中是單個屬性和單個函式的宣告。

class ChildObject:
    num = 1

    def printStatement():
        print("This is a child object.")

要驗證 ChildObject 類是否繼承了 object 類中的任何屬性和函式,請使用 dir() 函式,該函式返回在指定物件中定義的所有函式和屬性的列表。

print(dir(ChildObject))

輸出:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'num', 'printStatement']

觀察到在 num 屬性和 printStatement 函式之前,有相當多的私有屬性和函式沒有在 ChildObject 中明確定義;這意味著它們要麼在類中隱式定義,要麼從 object 類繼承。

讓我們使用相同的函式 dir() 檢查 object 類的屬性和函式:

print(dir(object))

輸出:

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

Python 中的 type 元類

現在我們已經討論了 object 類,讓我們討論 Python 中的實際元類,type。同樣,元類是一個例項化並定義另一個類的行為的類。

兩個函式可以公開給定類的元類:type()__class__。這兩個函式都輸出給定引數的類。

例如,讓我們對上述示例中的給定 ChildObject 類使用 type()__class__ 函式。

class ChildObject:
    num = 1

    def printStatement():
        print("This is a child object.")


print(type(ChildObject))
print(ChildObject.__class__)

輸出:

<class 'type'>
<class 'type'>

兩個函式都輸出 <class 'type'>。這表明 ChildObject 類屬於 type 型別。typeChildObject 類和任何其他類的元類。

總之,type 是隱式定義任何例項化類行為的元類。這不被視為常識,因為這是在程式碼後臺完成的,沒有開發人員的干預。所以元類的概念只有在有人深入研究 Python 原始碼和文件時才知道。

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

相關文章 - Python Class