我正在开发游戏,遇到了问题。尝试调用draw_red_team_one()
方法时出现错误,但看不到原因。
它说缺少1个必需的位置参数:self
,所以我检查了一下,发现我必须先写RT = red
,然后写self.draw_red_team_one()
,所以我解决了这个问题,但仍然可以同样的错误。
class red:
def __init__(self):
self.x_y = [130, 290]
self.height_width = [10, 3]
self.red = [255, 0, 0]
def draw_salt(self, surface, color, x, y, height, width):
pygame.draw.rect(surface, color, ((x, y), (height, width)))
def draw_red_team_one(self):
self.draw_salt(screen, red, x_y[0], x_y[1], height_width[0], height_width[1])
running = True
while running:
RT = red
RT.draw_red_team_one()
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
我希望整个程序可以打开pygame窗口,并在左上角打印带有红色方框的白色水平线。该程序只是抛出一个错误。
答案 0 :(得分:2)
使用RT = red
将类分配给RT,但是draw_red_team_one
是实例方法,因此它需要在方法中声明的位置参数self
。如果在类red
的实例上调用此方法,则隐式传递参数,因此您不会注意到它,但是如果使用red.draw_red_team_one()
调用它,则必须自己传递它,否则收到您提到的错误消息。
换句话说:
obj.draw_red_team_one()
与以下相同:
red.draw_red_team_one(obj)
第二个变体就是执行第一个变体时Python隐式执行的操作。
但是无论如何,您将不需要经常使用red.draw_red_team_one
样式的方法。通常,只有在必须将方法作为可调用的地方传递时,才需要此方法。例如。如果您有一个带有方法的类,则该方法返回对象的某些信息,并且您想使用map
之类的方法来获取列表中每个对象的信息。在这种情况下,您将执行以下操作:
map(PersonClass.name, list_of_people)
与(在这两个都是返回相同元素的可迭代对象的意义上)相同:
[person.name() for person in list_of_people]
顺便说一句。我认为您的代码应该看起来像这样(尽管没有运行):
class red:
def __init__(self):
self.x_y = [130, 290]
self.height_width = [10, 3]
self.red = [255, 0, 0]
def draw_salt(self, surface, color, x, y, height, width):
pygame.draw.rect(surface, color, ((x, y), (height, width)))
def draw_red_team_one(self):
# you need to add self. to reference the instance variables
self.draw_salt(screen, self.red, self.x_y[0], self.x_y[1], self.height_width[0], self.height_width[1])
running = True
while running:
# create an object (this creates an instance and implicitely calls __init__ which performs your initialization code)
RT = red()
RT.draw_red_team_one()
pygame.display.flip()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False