TypeError: destroy() 接收 0 个位置参数,但给了 1 个
我在尝试从列表中移除一个精灵,以便把它从屏幕上擦除时,遇到了这个错误。我可以通过按一个键来显示这个精灵,但当我试图移除它时就出问题了。
我是在参考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()
。