我有粒子类型的对象的粒子列表,它有两个参数,位置和能量:
class Particle(object):
def __init__(self, pos, energy):
self.x = pos
self.E = energy
到目前为止,我设法做到的唯一方法是使用列表解析创建粒子列表:
number_of_particles = 10
initial_energy = 0
particle_list = [Particle(initial_energy,i) for i in range(number_of_particles)]
现在允许我做以下事情:
particle_list[0].x
这就是我想要的。
然而,我真正喜欢的是做如下的事情:
particle_list = ParticleList(no_of_particles, initial_energy)
并创建完全相同的列表。
我认为我必须以某种方式扩展列表类,但我不知道如何做到这一点。
答案 0 :(得分:2)
为什么不构建一个为您执行此操作的函数。你可以做一些简单的事情:
def ParticleList(no_of_particles, initial_energy):
return [Particle(initial_energy,i) for i in range(number_of_particles)]
这应该是获取列表的简单方法。
答案 1 :(得分:2)
class Particle(object):
def __init__(self, pos, energy):
self.x = pos
self.E = energy
@classmethod
def make_particle_list(self, no_particles, initial_energy=0):
return [Particle(i, initial_energy) for i in range(no_particles)]
# this is just for display purposes
def __repr__(self):
return 'pos: {p.x} - Energy: {p.E}'.format(p=self)
这为您提供了一点灵活性。如果你只需要一个粒子,你可以用正常的方式制作一个或者:
>>> lst = Particle.make_particle_list(10)
>>> lst
[pos: 0 - Energy: 0, pos: 1 - Energy: 0, pos: 2 - Energy: 0, pos: 3 - Energy: 0, pos: 4 - Energy: 0, pos: 5 - Energy: 0, pos: 6 - Energy: 0, pos: 7 - Energy: 0, pos: 8 - Energy: 0, pos: 9 - Energy: 0]
如果您需要不同的值,也可以传入不同的initial_energy
。
你的例子中也有你的论点。您已将initial_energy
作为列表推导中的第一个位置参数,但您将其作为__init__()
方法中的第二个。
答案 2 :(得分:0)
使用自定义__init__
方法创建课程。
class ParticleList(list):
def __init__(self, num, energy):
self.particle_list = [Particle(energy,i) for i in range(num)]
particles = ParticleList(2, 0).particle_list
for particle in particles:
print (particle.x, particle.E)
>>(0, 0)
>>(0, 1)
您可以创建自己的方法而不使用__init__
,这样您就可以简单地返回创建的列表而不将其分配给成员(__init__
不允许使用return
class ParticleList(list):
def create_list(self, num, energy):
return [Particle(energy,i) for i in range(num)]
my_list = ParticleList().create_list(2, 0)
值。)
class
正如其他人所说,你甚至不需要def create_list(num, energy):
return [Particle(energy,i) for i in range(num)]
my_list = create_list(2, 0)
而只能创建一个函数:
class testBox(b:Bundle) extends BlackBox {
val w = b.getWidth
val io = new Bundle {
val in = Bits(INPUT,w)
val out = Bits(OUTPUT,w)
}
}
class test extends Module {
val io = new Bundle {
val in = new testBundle
val out = (new testBundle).flip()
}
val testbox = Module(new testBox(io.in))
testbox.io.in := io.in.toBits
io.out := io.out.fromBits(testbox.io.out)
}