python中動態創建類


class Foo(Bar): pass 

Foo中有__metaclass__這個屬性嗎?如果是,Python會在內存中通過__metaclass__創建一個名字為Foo的類對象(我說的是類對象,請緊跟我的思路)。如果Python沒有找到__metaclass__,它會繼續在Bar(父類)中尋找__metaclass__屬性,並嘗試做和前面同樣的操作。如果Python在任何父類中都找不到__metaclass__,它就會在模塊層次中去尋找__metaclass__,並嘗試做同樣的操作。如果還是找不到__metaclass__,Python就會用內置的type來創建這個類對象。

類也是對象,在Python中,我們可以動態的創建類 1、在函數內部,需要類時動態創建 2、使用type內建函數 3、使用一個魔法方法 metaclass

(一)

函數內部,在分支語句中創建類函數使用

def stu(name): if name == 'foo': class Foo: print('我是Foo...%s'%name) else: class XFoo: print('我是XFoo...我被錯誤的創建了%s'%name) stu('foo') stu(123) 

以上就是用於檢驗引用函數時傳入的參數是否合理

(二)

type內建函數

#創建無屬性 無繼承的類 Foo = type('Foo',(),{}) print(Foo) #創建有屬性 無繼承類 Foo = type('Foo',(),{'name':'zhu'}) print(Foo.name) #創建有屬性,有繼承類 class Foo: name = 'zhu' FooChild = type('FooChild',(Foo,),{'age':19}) print(FooChild.name,FooChild.age) #創建帶方法的類 def select(self): print(self.name) class Foo: name = 'zhu' FooChild = type('FooChild',(Foo,),{'age':19,'select':select}) print(FooChild.name,FooChild.age,FooChild.select) fooChild = FooChild() fooChild.select() 

type()參數有三個,第一個是新建的類名,第二個是繼承的父類,是一個元組,第三個是類具有的屬性和方法,是一個字典,鍵是屬性名或者方法名

(三)

使用魔法方法創建類 metaclass

def upper_attr(future_class_name, future_class_parents, future_class_attr): # 遍歷屬性字典,把不是__開頭的屬性名字變為大寫 newAttr = {} for name, value in future_class_attr.items(): if not name.startswith("__"): newAttr[name.upper()] = value # 調用type來創建一個類 return type(future_class_name, future_class_parents, newAttr) class Foo(object, metaclass=upper_attr): bar = 'bip' print(hasattr(Foo, 'bar')) print(hasattr(Foo, 'BAR')) 

__mataclass__是為了創建元類而存在,如果類的tree中有,就會調用此方法,如果沒有就會使用type方法創建


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM