python 元類的使用(類的創建)

    什麼是元類?首先我們知道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__ = 具體的構建函數名。




   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章