Что означает сообщение об ошибке — (AttributeError: экземпляр Worm не имеет атрибута ‘vx’) и как я могу это исправить?

#python #pygame

#python #pygame

Вопрос:

Я следовал руководству, но продолжаю получать следующую ошибку
AttributeError: Worm instance has no attribute 'move'
Я не совсем уверен, что это значит или как это исправить. Ошибка относится к строке 44 в нижней части строки w.move() (решаемая ниже)

 import pygame

class Worm:
    """A Worm."""
    def __init__(self, surface, x, y, length):
        self.surface = surface
        self.x = x
        self.y = y
        self.length = length
        self.dir_x = 0
        self.dir_y = -1
        self.body = []
        self.crashed = False

    def key_event(self, event):
        """Handle Key events that affect the worm."""
        if event.key == pygame.K_UP:
            self.dir_x = 0
            self.dir_y = -1
        elif event.key == pygame.K_DOWN:
            self.dir_x = 0
            self.dir_y = 1
        elif event.key == pygame.K_DOWN:
            self.dir_x = -1
            self.dir_y = 0
        elif event.key == pygame.K_DOWN:
            self.dir_x = 1
            self.dir_y = 0 
    def draw(self):
        for x, y in self.body:
            self.surface.set_at((x, y), (255, 255, 255))

width = 640
height = 400

screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
running = True

w = Worm(screen, width/2, height/2, 200)

while running:
    screen.fill((0, 0, 0))
    w.move()
    w.draw()

    if w.crashed or w.x <= 0 or w.x >= width -1 or w.y <= 0 or w.y >= height -1:
        print "crash"
        running = False

    for event in  pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            w.key_event(event)

    pygame.display.flip()
    clock.tick(240)
 

———-Изменить ———

код:

 import pygame

class Worm:
    """A Worm."""
    def __init__(self, surface, x, y, length):
        self.surface = surface
        self.x = x
        self.y = y
        self.length = length
        self.dir_x = 0
        self.dir_y = -1
        self.body = []
        self.crashed = False

    def key_event(self, event):
        """Handle Key events that affect the worm."""
        if event.key == pygame.K_UP:
            self.dir_x = 0
            self.dir_y = -1
        elif event.key == pygame.K_DOWN:
            self.dir_x = 0
            self.dir_y = 1
        elif event.key == pygame.K_DOWN:
            self.dir_x = -1
            self.dir_y = 0
        elif event.key == pygame.K_DOWN:
            self.dir_x = 1
            self.dir_y = 0 
    def draw(self):
        for x, y in self.body:
            self.surface.set_at((x, y), (255, 255, 255))
    def move(self):
        """move worm."""
        self.x  = self.vx
        self.y  = self.vy

        if (self.x, sel.y) in self.body:
            self.crashed = True

        self.body.insert(0, (self.x, self.y))

        if len(self.body) > self.length:
            self.body.pop()

    def draw(self):
        #for x, y self.body:
        #    self.surface.set_at((x, y),self.color)
        x, y = self.body[0]
        self.surface.set_at((x, y), self.color)
        x, y = self.body[-1]
        self.surface.set_at((x, y), (0, 0, 0))


width = 640
height = 400

screen = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
running = True

w = Worm(screen, width/2, height/2, 200)

while running:
    screen.fill((0, 0, 0))
    w.move()
    w.draw()

    if w.crashed or w.x <= 0 or w.x >= width -1 or w.y <= 0 or w.y >= height -1:
        print "crash"
        running = False

    for event in  pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            w.key_event(event)

    pygame.display.flip()
    clock.tick(240)
 

и ошибка —

 Traceback (most recent call last):
  File "C:/Users/Enrique/Dropbox/Public/snakegametutorial.py", line 65, in <module>
    w.move()
  File "C:/Users/Enrique/Dropbox/Public/snakegametutorial.py", line 34, in move
    self.x  = self.vx
AttributeError: Worm instance has no attribute 'vx'
 

Комментарии:

1. w.move() Move не существует.

Ответ №1:

AttributeError указывает, что вы пытались получить доступ к свойству или методу объекта, который не был определен в определении класса объекта.

Просто кажется, что вы недостаточно продвинулись в учебном коде, чтобы определить Worm.move() метод. Это происходит в строке 43 руководства, незадолго до Worm.draw() этого. Вы направляетесь к другому AttributeError draw() методу, поскольку вы еще не определили его. Просто добавьте оба из них в определение Worm класса.

  43     def move(self):
 44         """ Move the worm. """
 45         self.x  = self.vx
 46         self.y  = self.vy
 47 
 48         if (self.x, self.y) in self.body:
 49             self.crashed = True
 50 
 51         self.body.insert(0, (self.x, self.y))
 52 
 53         if (self.grow_to > self.length):
 54             self.length  = 1
 55 
 56         if len(self.body) > self.length:
 57             self.body.pop()
 58
 59     def draw(self):
 60         #for x, y in self.body:
 61         #    self.surface.set_at((x, y), self.color)
 62         x, y = self.body[0]
 63         self.surface.set_at((x, y), self.color)
 64         x, y = self.body[-1]
 65         self.surface.set_at((x, y), (0, 0, 0))
 

Обновить

Теперь вы получаете AttributeError on Worm.vx , потому что у вас отсутствует это свойство (также vy ) Worm.__init__() . Сравните свой код с кодом под заголовком Улучшенная игра на странице руководства. Когда вы столкнетесь с дальнейшими ошибками, сравните свое определение класса с определением из учебника.

Добавить в __init__()

 def __init__(self, surface):
    ...
    ...
    self.vx = 0
    self.vy = -1
    ...
    ...
 

Комментарии:

1. я попробовал, но у меня появились новые ошибки. Я думаю, что я изменил программу, как вы сказали … я опубликовал ошибку и внес изменения сверху

2. @enrique2334 Смотрите обновление. Вам не хватает свойств vx, vy из руководства __init__()

3. Пожалуйста, обратите внимание на общую схему. Как только вы поймете, что означают «экземпляр» и «атрибут», сообщение об ошибке, в котором говорится «Экземпляр X не имеет атрибута ‘y'», означает именно то, что оно говорит, и совершенно ясно.

Ответ №2:

dir_x и dir_y являются ли vx и vy, вы должны изменить их … на vx и vy…