Получение имени ошибки: имя 'IMGS' не определено, думал, что я определил его внутри класса - PullRequest
0 голосов
/ 15 апреля 2020

В классе птицы определена переменная IMGS, но я получаю ошибку имени, если она объявлена ​​как глобальная переменная.

**BIRD_IMGS** = [pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird1.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird2.png"))), pygame.transform.scale2x(pygame.image.load(os.path.join("imgs", "bird3.png")))]

class Bird:
    **IMGS** = BIRD_IMGS
    MAX_ROTATION = 25
    ROT_VEL = 20
    ANIMATION_TIME = 5

    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.tilt = 0
        self.tick_count = 0
        self.vel = 0
        self.height = self.y
        self.img_count = 0
        self.img = self.IMGS[0]

    def draw (self, win):
        self.img_count += 1

NameError: имя 'IMGS' не определено

    # to make the wing flapping animation
        if self.img_count < self.ANIMATION_TIME:
            self.img = IMGS[0]
        elif self.img_count < self.ANIMATION_TIME*2:
            self.img = IMGS[1]
        elif self.img_count < self.ANIMATION_TIME*3:
            self.img = IMGS[2]
        elif self.img_count < self.ANIMATION_TIME*4:
            self.img = IMGS[1]
        elif self.img_count < self.ANIMATION_TIME*4 + 1:
            self.img = IMGS[0]

main ()

1 Ответ

2 голосов
/ 15 апреля 2020

Имена, определенные на верхнем уровне блока class, становятся атрибутами класса (атрибуты объекта «класс», общие для всех экземпляров класса) - они не отображаются в «глобальном» пространстве имен модуля. IOW, вам нужно go через класс или его экземпляр для доступа к ним, ie:

print(Bird.IMGS)
b = Bird()
print(b.IMGS)
print(b.IMGS is Bird.IMGS)

И так как Python не имеет неявного указателя this в ваших методах, Вы должны использовать текущий экземпляр (self) для доступа к этому атрибуту:

if self.img_count < self.ANIMATION_TIME:
    self.img = self.IMGS[0]
...