2017-02-20 96 views
3

我正在創建與pyvisa一起使用的儀器類。而不是手動轉換每個SCPI命令(約400)進入方法,我想只是命令快速參考複製到一個文本文件,並有一個像這樣的命令:如何動態添加本地變量到動態創建的Python類方法

[SENSe:]TEMPerature:TRANsducer:RTD:RESistance[:REFerence]? [{MIN|MAX}] 

風起來像這樣的方法:

def temp_tran_rtd_res_qry(*args): 
    <check for valid arguments> 
    cmd = 'TEMPerature:TRANsducer:RTD:RESistance?' 
    argstr = '' 
    for arg in args: 
     argstr += ' ' + arg 
    return self.query(cmd + argstr) 

我有一個解析命令的句柄,我想出瞭如何使用setattr()從模板函數創建具有正確名稱的方法。

給我麻煩的部分是每個方法都知道要分配給cmd的地方。我想我可能會將原始字符串作爲屬性添加到類中(類似於方法),並在方法中動態解析它們,但爲此,可以根據名稱(或某些東西)檢索類屬性)。

+0

可能的重複[如何動態創建類的方法在python](http://stackoverflow.com/questions/17929543/how-can-i-dynamically-create-class-methods-for-a -class-in-python) – JacaByte

+0

這就是我發現的答案,就像我一樣。我的問題比創建方法還要多一點。也許我的問題不夠具體。 – Jim

回答

1

所以,這裏是我想通了:

>>> class A(object): 
    pass 

>>> a = A() 
>>> a. # Only default 'object' methods avaliable 
>>> cmdstr = '[SENSe:]VOLTage[:DC]:RANGe[:UPPer] {<range>|MIN|MAX|DEF} ' 
>>> querystr = """def query(cls, *args): cmd = '{s}'; return command_handler(*args, cmdstr=cmd)""" 
>>> exec(querystr.format(s=cmdstr)) 
>>> setattr(A, command_name(command_abridge(cmdstr)), classmethod(query)) 
>>> a.volt_rang() # Autocomplete works 
<results from command_handler()> 

我可以寫一個文件分析器爲__init__的方法添加到類在文本文件中的每個命令字符串,我可以寫一個通用的方法解析參數併爲實際查詢構建命令字符串。