2017-02-20 97 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__的方法添加到类在文本文件中的每个命令字符串,我可以写一个通用的方法解析参数并为实际查询构建命令字符串。