TypeError: destroy() 接收 0 个位置参数,但给了 1 个

2 投票
1 回答
1391 浏览
提问于 2025-04-18 12:55

我在尝试从列表中移除一个精灵,以便把它从屏幕上擦除时,遇到了这个错误。我可以通过按一个键来显示这个精灵,但当我试图移除它时就出问题了。

我是在参考Purpongie的碰撞检测视频,自己摸索着写代码的。

现在我会给你看我的代码,省略了一些不相关的部分:

Main.py

while True:
    process(Select)
    H2Ps.destroy()
    H2Ps.List.draw(screen)

Classes.py

class BaseClass(pygame.sprite.Sprite):
allsprites = pygame.sprite.Group()
def __init__(self, x, y, image_string):

    pygame.sprite.Sprite.__init__(self)
    BaseClass.allsprites.add(self)

    self.image = pygame.image.load(image_string)

    self.rect = self.image.get_rect()
    self.rect.x = x
    self.rect.y = y


def destroy(self, ClassName):
    ClassName.List.remove(self)
    BaseClass.allsprites.remove(self)
    del self



class H2Ps(BaseClass):
List = pygame.sprite.Group()

def __init__ (self,x,y,image_string):
    BaseClass.__init__(self,x,y,image_string)
    H2Ps.List.add(self)

@staticmethod
def destroy():
    for test in H2Ps.List:
        if (pygame.key.get_pressed()[pygame.K_ESCAPE]):
            test.destroy(H2Ps)

Process.py

def process(Select):
    if Select.rect.collidepoint(370,400): #How to play
        if keys[pygame.K_RETURN]:
            HowToPlay = H2Ps(0,0,"Images/How To Play.png")

我觉得这个错误是因为在Classes.py中的test.destroy(H2Ps)出了一些问题。我之前运行过这个代码,似乎是可以的,但现在我不确定我改了什么导致它出错。我非常希望能得到一些解决方案。

1 个回答

1

你在 BaseClass 里重写了 destroy(self, ClassName) 方法,用你在 H2Ps 里定义的 destroy() 静态方法。你需要把其中一个名字改一下!

所以,当你在 main.py 里调用 H2Ps.destroy() 时,你其实是在调用你定义的静态方法,这个方法会遍历 List

for test in H2Ps.List:
    if (pygame.key.get_pressed()[pygame.K_ESCAPE]):
        test.destroy(H2Ps)

这里的 test 是一个 H2Ps 对象,当你执行 test.destroy(H2Ps) 时,你仍然是在调用 H2Ps 上定义的静态方法,而不是在 BaseClass 上的 destroy(self, ClassName) 方法。

和一些其他编程语言不同,方法不能仅通过参数来区分,比如在 Java 中,编译器可以区分这些方法:

public void destroy(String className);
public static void destroy();

但 Python 不是这样,它只通过方法的名字来决定调用哪个方法。当你在 H2Ps 中重写 destroy 时,你实际上是把 destroy(self, ClassName) 的定义替换成了 destroy()

撰写回答