在Python中使用Eval创建类变量

Cur*_*urt 1 python wxpython scientific-computing

我写了一个类,让我传入变量类型,变量名,提示和默认值的列表.该类创建一个wxPython面板,该面板显示在一个框架中,该框架允许用户在按下计算按钮并将结果作为绘图返回之前设置输入值.我使用exec语句将所有变量添加到类中.这将所有变量保存在一个类中,我可以通过名称引用它们.

light = Variables( frame , [ ['f','wavelength','Wavelength (nm)',632.8] ,\
                             ['f','n','Index of Refraction',1.0],])
Run Code Online (Sandbox Code Playgroud)

在类中,我使用以下语句创建和设置变量:

for variable in self.variable_list:
       var_type,var_text_ctrl,var_name = variable
       if var_type == 'f' :  
           exec( 'self.' + var_name + ' = ' + var_text_ctrl.GetValue() )
Run Code Online (Sandbox Code Playgroud)

当我需要使用变量时,我可以通过名称引用它们:

 wl = light.wavelength
 n = light.n
Run Code Online (Sandbox Code Playgroud)

然后我读到SO,很少需要在Python中使用exec.这种方法有问题吗?有没有更好的方法来创建一个类,该类包含应该组合在一起的变量,您希望能够编辑,还有用于显示,编辑的代码和wxPython调用(并且还将所有变量保存到文件中)还是再读一遍)?

生硬的

mip*_*adi 18

您可以使用该setattr函数,该函数有三个参数:对象,属性的名称及其值.例如,

setattr(self, 'wavelength', wavelength_val)
Run Code Online (Sandbox Code Playgroud)

相当于:

self.wavelength = wavelength_val
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

for variable in self.variable_list:
       var_type,var_text_ctrl,var_name = variable
       if var_type == 'f' :
           setattr(self, var_name, var_text_ctrl.GetValue())
Run Code Online (Sandbox Code Playgroud)