1. 程式人生 > >廖雪峰Python學習筆記——使用元類

廖雪峰Python學習筆記——使用元類

ram form 創建對象 字典 comm params int name 學習筆記

元類(MetaClasses)

元類提供了一個改變Python類行為的有效方式。

元類的定義是“一個類的類”。任何實例是它自己的類都是元類。

class demo(object):
    pass
 
obj = demo()
 
print "Class of obj is {0}".format(obj.__class__)
print "Class of obj is {0}".format(demo.__class__)
 
# Class of obj is <class ‘__main__.demo‘>
# Class of obj is <type ‘type‘>

在上例中,我們定義了一個類demo,並且生成了一個該類的對象obj。首先,可以看到obj的__class__是demo。有意思的來了,那麽demo的class又是什麽呢?可以看到demo的__class__是type。

所以說type是python類的類,換句話說,上例中的obj是一個demo的對象,而demo本身又是type的一個對象。

所以說type就是一個元類,而且是python中最常見的元類,因為它使python中所有類的默認元類。

因為元類是類的類,所以它被用來創建類(正如類是被用來創建對象的一樣)。但是,難道我們不是通過一個標準的類定義來創建類的麽?的確是這樣,但是python內部的運作機制如下:

    • 當看見一個類定義,python會收集所有屬性到一個字典中。
    • 當類定義結束,python將決定類的元類,我們就稱它為Meta吧。
    • 最後,python執行Meta(name, bases, dct),其中:

a. Meta是元類,所以這個調用是實例化它。
b. name是新建類的類名。
c. bases是新建類的基類元組
d. dct將屬性名映射到對象,列出所有的類屬性。

那麽如何確定一個類(A)的元類呢?簡單來說,如果一個類(A)自身或其基類(Base_A)之一有__metaclass__屬性存在,則這個類(A/Base_A)就是類(A)的元類。否則type就將是類(A)的元類。

廖雪峰Python學習筆記——使用元類