python實現(xiàn)動態(tài)創(chuàng)建類的方法分析
本文實例講述了python實現(xiàn)動態(tài)創(chuàng)建類的方法。分享給大家供大家參考,具體如下:
python作為動態(tài)語言,如何在運行時動態(tài)創(chuàng)建類呢(python Creating classes dynamically),這在編程時,有時候很有用處,動態(tài)生成類,給予相應(yīng)的屬性和方法。通常來說有如下兩種方式:
- 1. 根據(jù)條件,硬編碼實現(xiàn)。
- 2. 利用 type metaclass 來實現(xiàn)。
根據(jù)條件硬編碼
def choose_class(name):
if name == 'foo':
class Foo(object):
pass
return Foo # 返回一個類,而不是實例
else:
class Bar(object):
pass
return Bar
MyClass = choose_class('foo')
print MyClass # 返回一個類,而不是實例
print MyClass() # 創(chuàng)建一個實例
運行后,結(jié)果為:
<class '__main__.Foo'>
<__main__.Foo object at 0x00BA8370>
但其實這并不是那么動態(tài),你還得在程序中寫完整個class的定義。既然class是對象,也必定可以由什么東西創(chuàng)建出來。在python中,當(dāng)你用 class 關(guān)鍵字的時候,python將自動創(chuàng)建這個object, 有什么方法能手動創(chuàng)建呢,那就是 type 方法. 這是一個很特殊的方法,能夠創(chuàng)建一個類. type 的語法如下:
type(name of the class, tuple of the parent class (for inheritance, can be empty), dictionary containing attributes names and values)
按照這個語法規(guī)則,做如下例子:
def echo_msg(self):
print self.msg
print '===dynamic create class==='+ '*'*50
MyClass = type('MyClass',(object,),{"a":123,"b":"summer","msg":"test message","echo_msg":echo_msg})
print MyClass.a
myclass = MyClass()
myclass.echo_msg()
print myclass.a,myclass.b
print '===dynamic create subclass==='+ '*'*50
MySubClass = type('MySubClass',(MyClass,),{"c":"c-value"})
print MySubClass.c,MySubClass.a,MySubClass.b
print issubclass(MySubClass, MyClass)
mysubclass = MySubClass()
mysubclass.echo_msg()
運行結(jié)果如下:
===dynamic create class===**************************************************
123
test message
123 summer
===dynamic create subclass===**************************************************
c-value 123 summer
True
test message
這個例子利用 type 創(chuàng)建了一個MyClass 類,然后又創(chuàng)建了 MySubClass 繼承了MyClass 類,并綁定了屬性,方法。MySubClass 也綁定自己特有的屬性,同時又繼承了基類的屬性,方法。
這樣就實現(xiàn)了,在python 中動態(tài)創(chuàng)建類,主要功臣就是 type 方法,為什么type 有這么厲害,其最終原因是:type 是 metaclass ,元類,用來創(chuàng)建類的類。打個比方:
Class=MetaClass() instance=Class()
什么是 metaclass ,又將怎么利用呢,后面的文章將詳細(xì)講解 python metaclass.
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對大家Python程序設(shè)計有所幫助。
- Python中動態(tài)創(chuàng)建類實例的方法
- python 動態(tài)獲取當(dāng)前運行的類名和函數(shù)名的方法
- Python實現(xiàn)動態(tài)添加類的屬性或成員函數(shù)的解決方法
- Python實現(xiàn)動態(tài)加載模塊、類、函數(shù)的方法分析
- 在python的類中動態(tài)添加屬性與生成對象
- Python類的動態(tài)修改的實例方法
- python 類對象和實例對象動態(tài)添加方法(分享)
- python類的方法屬性與方法屬性的動態(tài)綁定代碼詳解
- Python內(nèi)置函數(shù)Type()函數(shù)一個有趣的用法
- 詳解Python中的type()方法的使用
- Python使用type動態(tài)創(chuàng)建類操作示例
相關(guān)文章
Python中url標(biāo)簽使用知識點總結(jié)
這篇文章主要介紹了Python中url標(biāo)簽使用知識點以及相關(guān)實例代碼,需要的朋友們參考下。2020-01-01
Pycharm中flask開啟debug模式的詳細(xì)流程
PyCharm是一個強大的集成開發(fā)環(huán)境(IDE),非常適合Python開發(fā)者,包括Flask框架,當(dāng)你在使用Flask開發(fā)Web應(yīng)用時,Debug功能是非常重要的,它允許你在運行時檢查程序的狀態(tài)、調(diào)試代碼錯誤,本文將介紹Pycharm中flask開啟debug模式的詳細(xì)流程,需要的朋友可以參考下2024-08-08
Python3網(wǎng)絡(luò)爬蟲中的requests高級用法詳解
本節(jié)我們再來了解下 Requests 的一些高級用法,如文件上傳,代理設(shè)置,Cookies 設(shè)置等等。感興趣的朋友跟隨小編一起看看吧2019-06-06
Python函數(shù)調(diào)用追蹤實現(xiàn)代碼
這篇文章主要介紹了Python函數(shù)調(diào)用追蹤實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
基于Django的樂觀鎖與悲觀鎖解決訂單并發(fā)問題詳解
這篇文章主要介紹了基于Django的樂觀鎖與悲觀鎖解決訂單并發(fā)問題詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07
python編程學(xué)習(xí)使用管道Pipe編寫優(yōu)化代碼
大家好,今天這篇文章我將詳細(xì)講解 Pipe 如何讓你的代碼更加簡潔的方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
Python pandas RFM模型應(yīng)用實例詳解
這篇文章主要介紹了Python pandas RFM模型應(yīng)用,結(jié)合實例形式詳細(xì)分析了pandas RFM模型的概念、原理、應(yīng)用及相關(guān)操作注意事項,需要的朋友可以參考下2019-11-11
Python基于jieba分詞實現(xiàn)snownlp情感分析
情感分析(sentiment analysis)是2018年公布的計算機科學(xué)技術(shù)名詞,它可以根據(jù)文本內(nèi)容判斷出所代表的含義是積極的還是負(fù)面的等。本文將通過jieba分詞實現(xiàn)snownlp情感分析,感興趣的可以了解一下2023-01-01

