扩展列表类以创建对象列表

时间:2015-05-29 16:23:11

标签: python

我有粒子类型的对象的粒子列表,它有两个参数,位置和能量:

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)

并创建完全相同的列表。

我认为我必须以某种方式扩展列表类,但我不知道如何做到这一点。

3 个答案:

答案 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)
}
相关问题