【发布时间】:2010-10-29 14:40:11
【问题描述】:
这是问题 912526 - How do I pass lots of variables to and from a function in Python? 的后续。
在我正在编写的程序中有很多变量需要传递,从我之前的问题中我了解到我应该将这些变量放入类中,然后传递类。
其中一些变量以重复的形式出现 - 对于薄膜计算,我需要跟踪多个层的光学特性(折射率、吸收、厚度等)。
存储这样的变量的最佳方法是创建一个派生自 Python 列表的类来存储一组类,每个类都保存单个层的变量?然后将处理从列表派生的类中的层集的函数,以及处理该类中的特定层的函数?有没有更好的方法可以用一个班级来做到这一点?
在以下示例中使用两个类方法,我可以进行设置,以便我可以使用类似的语句访问变量
n1 = layers[5].n
这是最好的方法,对吧?
#Test passing values to and from functions
class Layers(list):
def add(self,n,k,comment):
self.append( OneLayer(n,k,comment) )
def input_string(self):
input_string = []
for layer in self:
vars = layer.input_string()
for var in vars:
input_string.append( var )
return input_string
def set_layers(self,results):
for layer,i in enumerate(self):
j = i*layer.num_var
layer.set_layer( *results[j:j+2] )
class OneLayer(object):
def __init__(self,n,k,comment):
self.n = n
self.k = k
self.comment = comment
def input_string(self):
return [['f','Index of Refraction',self.n], ['f','Absorption',self.k],['s','Comment',self.comment]]
def set_layer(self,n,k,comment):
self.n = n; self.k=k; self.comment = comment
def num_var(self):
return 3
if __name__ == '__main__':
layers = Layers()
layers.add(1.0,0.0,'This vacuum sucks')
layers.add(1.5,0.0,'BK 7 Glass')
print layers[0].n
print layers.input_string()
layers[1].set_layer(1.77,0.0,'Sapphire')
print layers.input_string()
我从这个测试程序得到以下输出:
1.0
[['f', 'Index of Refraction', 1.0], ['f', 'Absorption', 0.0], ['s', 'Comment', 'This vacuum sucks'], ['f', 'Index of Refraction', 1.5], ['f', 'Absorption', 0.0], ['s', 'Comment', 'BK 7 Glass']]
[['f', 'Index of Refraction', 1.0], ['f', 'Absorption', 0.0], ['s', 'Comment', 'This vacuum sucks'], ['f', 'Index of Refraction', 1.77], ['f', 'Absorption', 0.0], ['s', 'Comment', 'Sapphire']]
【问题讨论】:
-
你真的需要一个继承自
list的Layers类吗?只需使用列表即可。