內(nèi)置函數(shù)type

使用type創(chuàng)建帶有屬性的類

type接受一個(gè)字典來為類定義屬性,因此

>>>Foo=type('Foo',(),{'bar':True})

可以翻譯為:

>>>class Foo(object):
...            bar=True

并且可以將FOO當(dāng)成一個(gè)普通的類一樣使用:

>>>print (Foo)
<class '__main__.Foo'>
>>>print(Foo.bar)
True
>>>f=Foo()
>>>print(f)
<__main__.Foo object at 0x8a9b84c>
>>>print(f.bar)
True

當(dāng)然,你可以向這個(gè)類繼承,所以,如下的代碼:

>>>class FooChild(Foo):
...        pass

就可以寫成:

>>>FooChild=type('FooChild',(Foo,),{})
>>>print(FooChild)
<class '__main__.FooChild'>
>>>print(FooChild.bar) #bar屬性是由Foo繼承而來

注意:
type的第二個(gè)參數(shù),元組中是父類的名字,而不是字符串
添加的屬性是類屬性,并不是實(shí)例屬性

使用type創(chuàng)建帶有方法的類

類增加方法,只需要定義一個(gè)帶有恰當(dāng)簽名的函數(shù)并將其作為屬性賦值即可

添加實(shí)例方法

>>>def echo_bar(self):          #定義了一個(gè)普通函數(shù)
    ...      print(self.bar)
>>>FooChild=type('FooChild',(Foo,),{'echo_bar':echo_bar})
#FooChild類中的echo_bar屬性,指向了上面定義的函數(shù)
>>>hasattr(Foo,'echo_bar') #判斷Foo類中,是否有echo_bar這個(gè)屬性
>>>False
>>>hassattr(FooChild,'echo_bar') #判斷FooChild類中,是否有echo_bar這個(gè)屬性
>>>True
>>>my_foo=FooChild()
>>>my_foo.echo_bar()
True

添加靜態(tài)方法

>>>@staticmethod
...     def testStatic():
...            print("static method...")
>>>Foochild=type('Foochild',(Foo,),{"echo_bar":echo_bar,"testStatic"
...:testStativ})
>>>fooclid=Foochild()
>>>fooclid.test.Static
<function __main__.testStatic>
>>>fooclid.testStatic()
static  method...
>>>fooclid.echo_bar()
True

添加類方法

>>>@classmethod
 ....  def testClass(cls):
              print(cls.bar)
>>>Foochild=type('Foochild',(Foo,),{echo_bar":echo_bar,"testStatic"
...:testStativ,"testClass":testClass})
>>>fooclid=Foochild()
>>>fooclid.testClass()
True

可以看到,在python中,類也是對象,可以動(dòng)態(tài)的創(chuàng)建類。使用關(guān)鍵字 class時(shí)python在幕后做的事情,就是通過元類來實(shí)現(xiàn)的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,255評(píng)論 6 342
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,781評(píng)論 25 709
  • 辯手:思維活躍,邏輯嚴(yán)謹(jǐn),能從各種角度論證任何觀點(diǎn)的語言高手。持方是什么,他們就持某一觀點(diǎn)。這是專業(yè)辯手給人的普遍...
    自閉癥要不自閉閱讀 1,010評(píng)論 6 0
  • 明明失敗了,卻不肯承認(rèn),不肯吸取教訓(xùn),硬要說這一切都是順其自然的事情,硬要說只是不懂事,還有這樣的事情依然要沒心沒...
    SweetCC閱讀 122評(píng)論 0 0

友情鏈接更多精彩內(nèi)容