Python中的动态对象实例化

3
我遇到了一个问题,我不知道如何动态实例化多个类的实例。例如,我有一个文件,每行都有x、y、z和t坐标。我想将每一行放入一个名为Droplet的类中,该类由x、y唯一标识,因为z位置和时间会随着时间变化而变化。每个Droplet都将有一个哈希表,将时间映射到z坐标。
大局是,输入的每一行指定了水面在某个时刻的位置,我将使用Python在Blender中进行动画处理。
我遇到的问题是,我不知道要实例化多少个Droplet实例,所以我无法像下面这样做:
drop1 = Droplet(0,0)
drop2 = Droplet(0,1)
... and so on

有没有一种方法可以在Python中使用唯一的x,y作为标识符来自动化类实例化?

你不能只使用列表吗? - juanchopanza
我对使用列表持有犹豫态度,因为列表的大小取决于观察水域的时间长度和点数(分辨率)。我不想每次Blender需要渲染该点时都要迭代整个列表。 - user2619824
你可以对列表进行索引。不管怎样,我看到你选择了列表解决方案 :-) - juanchopanza
嗯,这是一个唯一的x、y坐标列表。我仍然会使用字典将t映射到Droplet中的z。稍微有些不同,因为在我选择的那个中,他每个Droplet实例都放置了一个xyzt。 - user2619824
3个回答

3

可以使用循环将对象放入列表中:

drops = []
for line in file:
    x, y, z, t = parseFromFile(line)
    drops.append(Droplet(x,y,z,t))

或者,更像Python的风格:
drops = [Droplet(*parseFromFile(line)) for line in file]

*这里使用parseFromFile返回的(可能是四个)值作为实例化Droplet的四个参数。


那么在Python中,我们不需要为类实例提供名称吗? - user2619824
2
这不是_class_的名称,而是从该类创建的实例的名称。它只是一个值,可以像您的示例中一样分配给命名变量,或者只需放入列表中。它与数字值没有区别。您可以将1000个数字放入列表中,也不会考虑为它们分配单独的名称,对吧?在这里也是如此(这也不是Python的特殊之处)。 - Nicolas78

2

如果您需要通过x和y方向唯一地标识它们(并且,我猜测,在新的具有相同坐标的对象出现时覆盖它们),我会使用由x和y索引的两维数组,并在该集合中存储Droplet对象。因此,类似于以下内容:

droplets[x][y] = Droplet(x,y,z,t)

您需要了解如何初始化二维数组;首先确保在x和y方向上,液滴有足够的空间容纳所有液滴。但是这样可以通过其x和y坐标选择任何特定的液滴。


1
在高层次上
drops = []
with open('drop_file.txt', 'r') as f:
    for line in f:
        x, y = line.strip().split()
        drops.append(Droplet(x, y))

然后当您需要对每个水滴执行某些操作时,可以循环遍历水滴列表。
这假设您的文件格式为:
x y x1 y1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接