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對象關係映射中.