問題背景:
最近在用python2為sublime2寫一個插件,其中有一個命令功能,就是輸入不同的命令調用不同的函數,但是python不支持switch,只用ifelse的話感覺特別的low而且明顯不是好的設計:如果要新增一個命令,就要先寫完函數以後再在ifelse裡面新增一行,不僅增加了代碼的工作量,而且也不是良好的結構設計,所以我想到了python的函數名__name__,能不能用函數名來實現自動查找相應函數去調用呢?
一般的想法是利用getattr,將函數裝到類裡面去,就像這樣:
>>>class testClass():
... def funcA(self,name):
... print 'funcA'+name
...
... def funcB(self):
... print 'funcB'
...
...
>>>t = testClass()
>>>a = getattr(t,'funcA',None)
>>>b = getattr(t,'funcB',None)
>>>a('name')
'funcAname'
>>>b()
'funcB'
--------------------------------------------------------------------------------
這樣就可以輕松實現工廠模式,但是這樣做有個弊端就是我們並不能夠動態的管理所有命令,而且有些命令指向同一個函數,這樣做也會使函數的管理變得很不方便,而且需要對類管理,每次更新文檔,我們都要重復的去修改文檔中的內容,於是想到了python的另一個強大的功能:字典
字典裡可以存儲函數,這樣只需要查找字典中的全部值再加上函數強大的__doc__就可以方便的對函數與文檔進行維護,而且易於查找的函數字典可以更方便更靈活的對函數進行操作
具體示例代碼如下:
def commandA(name):
'commandA is for testA'
print name
def commandB():
'commandB is for testB'
print 'hello world'
command = {'commandA':commandA,'commandB':commandB}
command['commandA']('testA')
command['commandB']()
def show_doc():
for func in command.values():
print func.__doc__
def commandf(commandstr,params = []):
func = command[commandstr]
if None != func:
func(params)
--------------------------------------------------------------------------------
當然這樣也不完善,因為要手動維護一個dict,但是比起文檔的麻煩來說,已經好太多了,而且有很重要的一點是,這樣的函數不用寫self參數,短了不少……
無需操作系統直接運行 Python 代碼 http://www.linuxidc.com/Linux/2015-05/117357.htm
CentOS上源碼安裝Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm
《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm
《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm
Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm
在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm
Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm
Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡