什麼是元類?首先我們知道python是一門面向對象的開發語言,在python中萬物皆對象,類也是對象。首先我們看下面一段代碼,使用class 創建一個類,當我們使用type函數打印類型是class‘type’,type就是一個元類,可以通過元類來創建類。元類就可以創建類的類。
>>> class objectCreate(object):
... pass
...
>>> type(objectCreate)
<class 'type'>
>>>
創建類的幾種方式
下面來舉例集幾種類的創建方式,明白類創建的過程(動態創建類)
# 函數創建,
def create_animal(type):
if type == 'Dog':
# 創建類
class Dog(object):
pass
return Dog
elif type == 'Cat':
class Cat(object):
pass
return Cat
Dog = create_animal("Dog")
print(type(Dog))
dog = Dog()
print(type(dog))
<class 'type'>#類類型
<class '__main__.create_animal.<locals>.Dog'>#對象類型
這裏通過調用函數傳圖不同的參數,來創建不同的類,創建出返回的是類的引用,並不是對象,我們可以通過返回的類來創建對象。
使用Type來動態創建類
type可以根據傳入的參數描述,根據具體的需要來動態創建出想要得到的類,傳入的參數格式爲:
type(類名,元祖(父類名組成,可以是多個,也可以是空),字典(屬性名和屬性值))
class Test1(object):
pass
Test2 = type("Test2", (object,), {})
print(type(Test1))
print(type(Test2))
#打印結果
<class 'type'>
<class 'type'>
可以看出兩種創建方式是相同的效果,說到這裏我們大家應該都明白了,原來type就是創建類的一個方法,python用它來創建類,也就是說他是所有類的元類,例如在pyhton中是不是還有int,str...等等類型,int就是用來創建整數的類,而str就是用來創建字符串的類,這裏的type也是,他就是python用來創建類的類(元類)。
這裏還有一個屬性__class__
按照我的理解就是,對象(類,對象,python中類也是對象).__class__輸出當前對象的創建對象。
Test2 = type("Test2", (object,), {})
test2 = Test2()
print(test2.__class__)#類
print(Test2.__class__)#對象
#打印出
<class '__main__.Test2'>#Test2類創建
<class 'type'>#type創建
__metaclass__屬性的使用
__metaclass__屬性作用呢是可以在定義類時爲類定製化(傳入個性化的設置),也就是說,類的創建時根據你的想法來創建的。之前我們創建類時系統默認創建,而現在我們利用metaclass屬性可以根據自己的需求來創建類。他是怎麼做到的呢?
# 定義構造類函數
def diy_class(create_calss_name, create_paretns_name, create_new_attr):
# 定義字典屬性
newAttr = {}
for name, value in create_new_attr.items():
if not name.startswith("__"):
# 轉換屬性名首字母大寫
newAttr[name.capitalize()] = value
print(newAttr)
return type(create_calss_name, create_paretns_name, create_new_attr)
class Animal(object, metaclass=diy_class):
dog = 'dog'
print(type(Animal))
print(Animal().dog)
打印效果
{'Dog': 'dog'}
<class 'type'>
dog
這裏可以看到這個新創建類的類名爲Animal,父類爲object,屬性Dog值爲dog。這裏就根據自己的設置創建了想要的類。
注意:這裏寫的是在python3.x中的創建過程,在類名後的括號中寫,在python2中可以不再類的括號中寫,在下面直接將__mataclass__ = 具體的構建函數名。