如何正确调用方法?

时间:2019-07-31 22:16:42

标签: python python-3.x pygame pycharm

我正在开发游戏,遇到了问题。尝试调用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窗口,并在左上角打印带有红色方框的白色水平线。该程序只是抛出一个错误。

1 个答案:

答案 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