为什么要在每个循环中调用append()?

问题描述 投票:-1回答:1

我有tile类:

class Tile:
    tile_pref = {
        "sprites": []
    }
    pos = Vector2(vector_zero)

    def img(self, x, y, tilemap, t):
        return self.tile_pref["sprites"][0]

    def __init__(self, img, pos):
        self.tile_pref["sprites"].append(img)
        self.pos = pos

以及另一部分,裁剪:src是有效的字符串路径,spacingtile_sizeoffset是具有.x.y的向量。self.__tiles__是数组。

img = pyglet.image.load(src)
for i in range((img.height - offset.x) // (spacing.x + tile_size.x) + 1):
  for j in range((img.width - offset.y) // (spacing.y + tile_size.y) + 1):
                a = offset.x + (tile_size.x + spacing.x) * j
                b = offset.y + (tile_size.y + spacing.y) * i
                self.__tiles__.append(Tile(img.get_region(a, b, tile_size.x, tile_size.y), Vector2(i, j)))

主要问题是tile_pref["sprites"]的长度不等于1,bu等于所有图块的数量。我该如何解决?


我认为,当我调用img.get_region时,它会返回一个指向它的链接。因此,只要链接更改,它就会调用append
python pyglet
1个回答
2
投票

这里:

class Tile:
    tile_pref = {
        "sprites": []
    }
    pos = Vector2(vector_zero)

您正在将tile_prefpos定义为class属性-属于类的属性(不属于...的实例),并且在所有实例之间共享。除非被实例属性遮盖,否则类属性也可以通过实例使用(这是您可以访问方法的类属性),因此在这里:

def __init__(self, img, pos):
    self.tile_pref["sprites"].append(img)

您实际上是在改变类自己的tile_pref属性-因此,您在此处添加的内容对于所有实例都是可见的。

注意以下行:

    self.pos = pos

创建一个'pos'instance属性(您绑定的是名称,而不是变异),这将遮蔽class属性。

关于它的价值,所有这些都是官方教程中的clearly and explicitely documented-因此,我建议您停止正在做的事情,花一天(或两天,如果需要的话)来完成整个] >教程,然后返回您的代码。这将为您节省时间,痛苦和沮丧。

© www.soinside.com 2019 - 2024. All rights reserved.