什麼是元類LOGIN

什麼是元類

透過上面的介紹,終於模糊的帶到元類這裡來了。可是我們到現在還不知道元類是什麼東東。

我們創建類別的時候,大多數是為了創建類別的實例物件。那麼元類呢?元類別就是用來創建類別的。也可以換個理解方式就是:元類別就是類別的類別。

透過上面 type() 函數的介紹,我們知道可以透過 type() 函數來建立類別:

MyClass = type('MyClass', (), {})

實際上 type() 函數是一個元類別。 type() 是 Python 在背後用來創建所有類別的元類別。

那現在我們也可以猜到為什麼 type() 函數是 type 而不是 Type呢?

這可能是為了和 str 保持一致性,str 是用來建立字串物件的類,而 int 是用來建立整數物件的類別。 type 就是建立類別物件的類別。你可以透過檢查 __class__ 屬性來看到這一點。 Python 中所有的東西,注意喔,這裡是說所有的東西,他們都是物件。這包括整數、字串、函數以及類別。它們全部都是對象,而且它們都是從一個類別創建而來。

# 整形
age = 23
print(age.__class__)
# 字符串
name = '两点水'
print(name.__class__)
# 函数
def fu():
    pass
print(fu.__class__)
# 实例
class eat(object):
    pass
mEat = eat()
print(mEat.__class__)

輸出的結果如下:

<class 'int'>
<class 'str'>
<class 'function'>
<class '__main__.eat'>

可以看到,上面的所有東西,也就是所有物件都是透過類別來創建的,那麼我們可能會好奇,__class__ 的__class__會是什麼呢?換個說法就是,創建這些類別的類別是什麼呢?

我們可以繼續在上面的程式碼基礎上新增下面的程式碼:

print(age.__class__.__class__)
print(name.__class__.__class__)
print(fu.__class__.__class__)
print(mEat.__class__.__class__)

輸出的結果如下:

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

認真觀察,再理清一下,上面輸出的結果是我們把整形age ,字元創name ,函數fu 和物件實例mEat 裡__class__ 的__class__ 印出來的結果。也可以說是他們類別的類別列印結果。發現列印出來的 class 都是 type 。

一開始也提到了,元類別就是類別的類別。也就是元類別就是負責創造類別的一種東西。你也可以理解為,元類別就是負責產生類別的。而 type 就是內建的元類別。也就是 Python 自帶的元類別。

下一節
章節課件