【问题标题】:I am getting an attribute error for an attribute defined inside the class. How can I fix this?我收到在类中定义的属性的属性错误。我怎样才能解决这个问题?
【发布时间】:2020-04-03 05:42:45
【问题描述】:

这是我得到的错误:

 File "/home/ore/PycharmProjects/testing grounds/venv/Moses and the Snakes.py", line 209, in <module>
    if stick.y - stick.radius < snake.the_hitbox[1] + snake.the_hitbox[3] and stick.y + stick.radius > snake.the_hitbox[1]:
AttributeError: type object 'snake' has no attribute 'the_hitbox'

这是我所有的相关代码:

class snake(object):
    rle_slither = [pygame.image.load(os.path.join(path, 'pixil-frame-2(3).png')),
                   pygame.image.load(os.path.join(path, 'pixil-frame-1(3).png')),
                   pygame.image.load(os.path.join(path, 'pixil-frame-0(4).png'))]
    lle_slither = [pygame.transform.flip(pygame.image.load(os.path.join(path, 'pixil-frame-2(3).png')), True, False),
                   pygame.transform.flip(pygame.image.load(os.path.join(path, 'pixil-frame-1(3).png')), True, False),
                   pygame.transform.flip(pygame.image.load(os.path.join(path, 'pixil-frame-0(4).png')), True, False)]

    def __init__(self, x, y, wid, len, end):
        self.x = x
        self.y = y
        self.wid = wid
        self.len = len
        self.end = end
        self.path = [self.x, self.end]
        self.walk_count = 0
        self.speed = 15
        self.the_hitbox = (self.x, self.y + 5, 78, 25)

    def movement(self):
        if self.speed > 0:
            if self.x + self.speed < self.path[1]:
                self.x += self.speed
            else:
                self.speed = self.speed * -1
                self.walk_count = 0
        else:
            if self.x - self.speed > self.path[0]:
                self.x += self.speed
            else:
                self.speed = self.speed * -1
                self.walk_count = 0

    def animate(self, screen):
        self.movement()
        if self.walk_count + 1 >= 9:
            self.walk_count = 0
        if self.speed > 0:
            screen.blit(self.rle_slither[self.walk_count // 3], (self.x, self.y))
            self.walk_count += 1
        else:
            screen.blit(self.lle_slither[self.walk_count // 3], (self.x, self.y))
            self.walk_count += 1
        self.the_hitbox = (self.x, self.y + 5, 78, 25)
        pygame.draw.rect(screen, (150, 0, 0), self.the_hitbox, 2)

    def got_hit(self):
        print("Snake was hit!")
    for stick in staff_list:
        if stick.y - stick.radius < snake.the_hitbox[1] + snake.the_hitbox[3] and stick.y + stick.radius > snake.the_hitbox[1]:
            if stick.x + stick.radius > snake.the_hitbox[0] and stick.x - stick.radius < snake.the_hitbox[0] - snake.the_hitbox[2]:
                snake.got_hit()
                staff_list.reomve(stick)

【问题讨论】:

  • 您应该改用self.the_hitbox 吗?通过使用snake.the_hitbox,您正在引用一个不存在的类变量。使用self,您将引用确实存在的实例变量。

标签: python class pygame attributeerror


【解决方案1】:

snake 替换为selfsnake 是类的名称,而self 是对该类实例的引用。

这段代码有三个问题:

  1. 您正在尝试在其自己的定义块中使用蛇类(因为最底部的 for 循环中的缩进)
  2. 您正在尝试使用类的名称作为该类的实例。这样做将在您实例化一个瞬间后替换类定义。
  3. 您从未创建过snake 的实例。根据经验,您应该使用 PascalCase 命名类,以便轻松地将它们与类实例区分开来。

请参阅下面的修复:

# Pascal case
class Snake(object):
    rle_slither = [pygame.image.load(os.path.join(path, 'pixil-frame-2(3).png')),
                   pygame.image.load(os.path.join(path, 'pixil-frame-1(3).png')),
                   pygame.image.load(os.path.join(path, 'pixil-frame-0(4).png'))]
    lle_slither = [pygame.transform.flip(pygame.image.load(os.path.join(path, 'pixil-frame-2(3).png')), True, False),
                   pygame.transform.flip(pygame.image.load(os.path.join(path, 'pixil-frame-1(3).png')), True, False),
                   pygame.transform.flip(pygame.image.load(os.path.join(path, 'pixil-frame-0(4).png')), True, False)]

    def __init__(self, x, y, wid, len, end):
        self.x = x
        self.y = y
        self.wid = wid
        self.len = len
        self.end = end
        self.path = [self.x, self.end]
        self.walk_count = 0
        self.speed = 15
        self.the_hitbox = (self.x, self.y + 5, 78, 25)

    def movement(self):
        if self.speed > 0:
            if self.x + self.speed < self.path[1]:
                self.x += self.speed
            else:
                self.speed = self.speed * -1
                self.walk_count = 0
        else:
            if self.x - self.speed > self.path[0]:
                self.x += self.speed
            else:
                self.speed = self.speed * -1
                self.walk_count = 0

    def animate(self, screen):
        self.movement()
        if self.walk_count + 1 >= 9:
            self.walk_count = 0
        if self.speed > 0:
            screen.blit(self.rle_slither[self.walk_count // 3], (self.x, self.y))
            self.walk_count += 1
        else:
            screen.blit(self.lle_slither[self.walk_count // 3], (self.x, self.y))
            self.walk_count += 1
        self.the_hitbox = (self.x, self.y + 5, 78, 25)
        pygame.draw.rect(screen, (150, 0, 0), self.the_hitbox, 2)

    def got_hit(self):
        print("Snake was hit!")

# Assuming staff_list is defined

# Instantiate a new Snake() instance and call it `snake`
snake = Snake()

for stick in staff_list:
    if stick.y - stick.radius < snake.the_hitbox[1] + snake.the_hitbox[3] and stick.y + stick.radius > snake.the_hitbox[1]:
        if stick.x + stick.radius > snake.the_hitbox[0] and stick.x - stick.radius < snake.the_hitbox[0] - snake.the_hitbox[2]:
            snake.got_hit()
            staff_list.reomve(stick)

【讨论】:

  • 不,因为我在类外调用了hitbox,所以我需要指定实例。
猜你喜欢
  • 2012-03-16
  • 2013-10-24
  • 1970-01-01
  • 2020-11-26
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
相关资源
最近更新 更多