元類

1 元類:動態創建一個類對象的類.

python 中一切皆對象,實例是由類創建的對象,類就是由元類創建的對象.

2 python中動態創建類的方式,是系統調用type這個元類來進行創建的.通過type()函數創建的類和直接寫class是完全一樣的,因爲Python解釋器遇到class定義時,僅僅是掃描一下class定義的語法,然後調用type()函數創建出class。

3 type動態創建類的語法格式:接受三個參數,返回類的引用.一般var_name和class_name一致.這樣就動態創建一個類了.

type(類名,繼承類的元祖,類的屬性字典)

var_name=type(class_name,(inherit_name),{"attr":attr_quote})

4 自定義一個元類.只需要繼承type,並調用type創建方法就行.格式如下:

先定義metaclass(元類),然後創建類(類中指定要metaclass)。

連接起來就是:先定義metaclass,就可以創建類,最後創建實例。

# coding=utf-8

class UpperAttrMetaClass(type):
    # __new__ 是在__init__之前被調用的特殊方法
    # __new__是用來創建對象並返回之的方法
    # 而__init__只是用來將傳入的參數初始化給對象
    # 你很少用到__new__,除非你希望能夠控制對象的創建
    # 這裏,創建的對象是類,我們希望能夠自定義它,所以我們這裏改寫__new__
    # 如果你希望的話,你也可以在__init__中做些事情
    # 還有一些高級的用法會涉及到改寫__call__特殊方法,但是我們這裏不用
    def __new__(cls, class_name, class_parents, class_attr):
        # 遍歷屬性字典,把不是__開頭的屬性名字變爲大寫
        new_attr = {}
        for name, value in class_attr.items():
            if not name.startswith("__"):
                new_attr[name.upper()] = value
        # 方法1:通過'type'來做類對象的創建
        return type(class_name, class_parents, new_attr)
        # 方法2:複用type.__new__方法
        # 這就是基本的OOP編程,沒什麼魔法
        # return type.__new__(cls, class_name, class_parents, new_attr)
class Foo(object, metaclass=UpperAttrMetaClass):
    bar = 'bip'
f = Foo()
print(f.BAR)

5 使用場景:主要使用在orm對象關係映射中.

發佈了42 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章