Я получил эту ошибку AttributeError: объект ‘function’ не имеет атрибута ‘hlauncher’ при попытке получить атрибут из другого файла

#python

#python #pygame

Вопрос:

Итак, у меня ошибка:

 launchercheck = game.update.hlauncher()
AttributeError: 'function' object has no attribute 'hlauncher'
  

Когда я хочу нажать пробел, чтобы выстрелить из своего оружия, это сработало до того, как я добавил это в код:

 launchercheck = game.update.hlauncher()
if launchercheck is True:
    self.kill()
  

Это self.kill() просто для проверки, работает ли моя If функция.

game.update.hlauncher() ссылается на мой main.py файл, там он должен искать в классе ‘game’ для ‘update’, а в ‘update’ он должен захватить hlauncher hlauncher должен измениться с False на True, когда игрок поднимает самонаводящийся лаунчер. Вот обновление в игре:

 def update(self):
    # update portion of the game loop
    self.all_sprites.update()
    self.camera.update(self.player)
    # game over
    if len(self.mobs) == 0:
        self.playing = False
    # player hits items
    hlauncher = False
    hits = pg.sprite.spritecollide(self.player, self.items, False)
    for hit in hits:
        if hit.type == 'health' and self.player.health < PLAYER_HEALTH:
            hit.kill()
            self.effects_sounds['health_up'].play()
            self.player.add_health(HEALTH_PACK_AMOUNT)
        if hit.type == 'pistol':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'pistol'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
        if hit.type == 'shotgun':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'shotgun'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
        if hit.type == 'rifle':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'rifle'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
        if hit.type == 'sniperrifle':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'sniperrifle'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
        if hit.type == 'launcher':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'launcher'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
        if hit.type == 'hominglauncher':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'hominglauncher'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
            hlauncher = True
    # mobs hit player
    hits = pg.sprite.spritecollide(self.player, self.mobs, False, collide_hit_rect)
    for hit in hits:
        if random() < 0.7:
            choice(self.player_hit_sounds).play()
        self.player.health -= MOB_DAMAGE
        hit.vel = vec(0, 0)
        if self.player.health <= 0:
            self.playing = False
    if hits:
        self.player.hit()
        self.player.pos  = vec(MOB_KNOCKBACK, 0).rotate(-hits[0].rot)
    # bullets hit mobs
    hits = pg.sprite.groupcollide(self.mobs, self.bullets, False, True)
    for mob in hits:
        for bullet in hits[mob]:
            mob.health -= bullet.damage
        mob.vel = vec(0, 0)
  

Я уже пытался поместить () за True и False в основной файл, который выдал ту же ошибку, и я уже повозился с game.update.hlauncher (), который должен смотреть на hlauncher каждый раз, когда я пытаюсь стрелять, чтобы подтвердить, что я держу hominglauncher и наоборот.

Спасибо за вашу помощь!

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

1. Почему вы ожидаете update иметь атрибут hlauncher ?

2. @goyo Итак, у меня есть обычная ракетная установка, и я хочу иметь самонаводящуюся пусковую установку, поэтому я установил атрибут hlauncher her, чтобы определить, является ли это самонаводящейся пусковой установкой или нет.

3. Вы имеете в виду hlauncher = False ? Это не установка атрибута в локальной переменной.

4. @goyo на что мне нужно его изменить?

5. Может self.hlauncher = False быть, и тогда launchercheck = game.hlauncher() . Или, что еще лучше, взгляните на учебник по python и потренируйтесь с более короткими программами, чтобы улучшить ваше понимание языка и, в частности, того, как работают классы, объекты и атрибуты.

Ответ №1:

Если update был экземпляром класса и hlauncher был функцией-членом этого класса, тогда ваш синтаксис был бы правильным.

Но hlauncher является локальной (?) переменной в функции update() . Это также может быть глобальная переменная, но это невозможно узнать из кода. Предполагая, что он локальный, нет способа получить к нему доступ извне функции обновления, потому что он существует только во время выполнения этой функции — вот что значит быть локально определенным. Если hlauncher определено глобально, в любое время его можно установить : hlauncher = True .

Но, вероятно, было бы лучше добавить эту функциональность в класс player:

 class Player:
    def __init__( self ):
        pygame.sprite.Sprite.__init__(self)
        ... # other stuff
        self.has_hlauncher  = False
        self.hlauncher_ammo = 0

    def addHLauncher( self ):
        self.has_hlauncher = True
        self.hlauncher_ammo  = 10
  

Тогда код может вызвать:

 self.player.addHLauncher()
  

Если у вас возникли трудности со всем этим, возможно, вы быстро прочитали, как работает переменная область видимости в Python.

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

1. Я думаю, вы не совсем поняли мой вопрос. Я просто хотел знать, как я импортирую что-то из другого файла в текущий.

2. Ах! import myfile , или from myfile import * . Если вы хотите получить переменные, вероятно, последнее — это то, что вам нужно.