gpt4 book ai didi

python - 如何使用派生自 Python 列表类的类

转载 作者:太空狗 更新时间:2023-10-29 22:24:08 25 4
gpt4 key购买 nike

这是问题 912526 - How do I pass lots of variables to and from a function in Python? 的跟进.

我正在编写的程序中有很多变量需要传递,从我之前的问题中我了解到我应该将这些变量放入类中,然后传递给类。

其中一些变量出现在重复的集合中 - 对于薄膜计算,我需要跟踪多个层的光学特性(折射率、吸收率、厚度等)。

像这样存储变量的最佳方法是创建一个从 Python 列表派生的类来存储一组类,每个类都包含一个层的变量吗?然后将处理层集的函数放在从列表派生的类中,以及处理该类中特定层的函数?有没有更好的方法可以用一个类(class)来做到这一点?

在下面的例子中使用两个类的方法,我可以设置一些东西,这样我就可以使用像这样的语句访问变量

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']]

最佳答案

您的代码中存在几个问题:

1.如果你进行任何列表操作,结果将是一个原生列表:

layers1 = Layers()
layers2 = Layers()
layers1 + layers2 -> the result will be a native list

2.当你可以覆盖__repr__时为什么要定义input_string或 __str__

3.为什么在这种情况下你甚至必须从列表派生?如果您希望类的行为与列表完全相同,则只需要从列表派生。但就您而言,您似乎正在寻找一个容器。要使您的类的行为类似于列表,您需要做的就是重写一些特殊的 Python 方法 http://docs.python.org/reference/datamodel.html#emulating-container-types

class Layers(object):
def __init__(self, container=None):
if container is None:
container = []
self.container = container

def add(self,n,k,comment):
self.container.append([n,k,comment])

def __str__(self):
return str(self.container)

def __repr__(self):
return str(self.container)

def __getitem__(self, key):
return Layers(self.container[key])

def __len__(self):
return len(self.container)

>>> l = Layers()
>>> l.add(1, 2, 'test')
>>> l.add(1, 2, 'test')
>>> l
[[1, 2, 'test'], [1, 2, 'test']]
>>> l[0]
[1, 2, 'test']
>>> len(l)
2

关于python - 如何使用派生自 Python 列表类的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/921334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com