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