通过循环覆盖实例变量 - 有没有更好的方法



我有一个类,我正在尝试使用由循环调整的给定变量为其创建对象。我正在努力解释,所以也许一个例子会有所帮助。实际的类比下面的类更复杂,但总体思路是相同的。下面的方法有效,但感觉很不对劲。

#!/usr/bin/python
class Cuboid:
  # default values for new instances
  width = 123
  height = 456
  depth = 789
  def __init__(self, var, val):
    exec("self." + var + " = val") # This feels un-pythony
  def area(self):
    return self.width*self.height*self.depth
param_list=[
['width',[5,10,15,20]],
['height',[5,10,15,20]]
]
for param_i in range(0,len(param_list)):
  for val_i in range(0,len(param_list[param_i][1])):
      thisCuboid = Cuboid(param_list[param_i][0],param_list[param_i][1][val_i])
      print(str(thisCuboid.area()))

这给出了预期的输出:

1798920
3597840
5396760
7195680
485235
970470
1455705
1940940

抱歉,如果问题措辞不佳,我对 python 很陌生。请随时提出更好的措辞/要求澄清!

请注意,需要更改的实际参数数量要多得多(类似于 20 维长方体来扩展类比,"面积"取决于所有 20 个值(,因此简单的方法(为每个参数创建一个列表并依次循环浏览列表,相应地设置命名参数(很快就会变得混乱(我需要为我要更改的每个参数添加一个循环(

感谢克里斯蒂安·迪恩,下面的效果更好!

#!/usr/bin/python
class Cuboid:
  # default values for new instances
  width = 123
  height = 456
  depth = 789
  def __init__(self, var, val):
    setattr(self, var, val)
  def volume(self):
    return self.width*self.height*self.depth
param_list=[
['width',[5,10,15,20]],
['height',[5,10,15,20]]
]
for paramname, paramvals in param_list:
  for val in paramvals:
    thisCuboid = Cuboid(paramname, val)
    print(str(thisCuboid.area()))

最新更新