簡體   English   中英

我收到類中定義的屬性的屬性錯誤。 我怎樣才能解決這個問題?

[英]I am getting an attribute error for an attribute defined inside the class. How can I fix this?

這是我得到的錯誤:

 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替換 snake snake是類的名稱,而 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM