首页 文章

通过循环覆盖实例变量 - 有更好的方法吗? [重复]

提问于
浏览 1530
1

这个问题在这里已有答案:

我有一个类,我正在尝试使用循环调整给定变量来创建对象 . 我很难解释所以也许一个例子会有所帮助 . 实际的类比下面的更复杂,但总体思路是一样的 . 以下方法有效,但感觉非常错误 .

#!/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个值),因此简单方法(为每个参数创建一个列表并循环通过反过来列表,相应地设置命名参数)快速搞乱(我需要为我想要更改的每个参数添加一个循环)

1 回答

  • 0

    感谢Christian Dean,下面的工作要好得多!

    #!/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()))
    

相关问题