Python - доступ к переменной экземпляра

1

В настоящее время я делаю игру. У меня есть 2 класса, и я хочу получить доступ к другим переменным экземпляра. Я не уверен, как это сделать или если это возможно.

Оба класса в некоторой точке наследуют класс gameEngine
gameEngine < - Игра
gameEngine < - SuperSprite < - Character < - Enemy
gameEngine < - SuperSprite < - Character < - Player

Класс My Game создает переменную экземпляра объекта self.player = Player(self), и я хочу иметь возможность использовать это в своем классе Enemy, чтобы он мог делать self.player.x. Поэтому я могу сделать ИИ в классе врагов, чтобы он знал о моем игроке. Любые предложения о том, как это сделать, моя логика может быть неправильной, поэтому любая помощь будет благодарна. Если мне нужно опубликовать мой код или что-то еще, скажите мне.

Это или я пытаюсь передать объект функции. Таким образом, bob может получить enemyAI в игровом классе. Но я получаю ошибку. Объект "Враг" не может быть вызван. Тем не менее он передает его, и функция распечатывает информацию, а затем умирает. НО, если я перемещаю self.enemyAi(self.bob) в состояние щелчка, он отлично работает.

if self.enemyWeakBtn.clicked:
    print "spawning enemey"
    self.bob = Enemy(self)

    self.enemies.append(self.bob)
    self.enemyGroup = self.makeSpriteGroup(self.enemies)
    self.addGroup(self.enemyGroup)
    self.enemyActive = True            

elif self.enemyActive:
    print self.bob
    self.enemyAi(self.bob)
    print " active"
Теги:
object
variables
instance

2 ответа

1

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

Есть два способа сделать это. Я использую второй метод atm в своих программах и планирую добавить первый метод.

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

class Game:
    instance = False

    def __init__(self):
        if self.__class__.instance:
            raise RunTimeError("Game has already been initialized.") # RunTimeError might be a bad choice, but you get the point
        self.__class__.instance = self

    @classmethod
    def getInstance(cls):
        return cls.instance

##>>> g = Game()
##>>> g
##<__main__.Game instance at 0x02A429E0>
##>>> del g
##>>> Game.getInstance()
##<__main__.Game instance at 0x02A429E0>
##>>> 
## Here you can have, in your enermy class, g = Game.getInstance(). And g.player will be able to access the player instance, and its properties

Второй способ сделать это - это то, с чем я работал. Это включает в себя класс игры, регулирующий ВСЕ в игре. Значение: все в переменной под игру. Кроме того, каждая отдельная игровая переменная (например, игрок) будет иметь атрибут, названный игрой, которая ссылается на экземпляр игры.

Пример:

class Player:
    def __init__(self, game):
        self.game = game
        print self.game.enermy

class Game:
    def __init__(self):
        self.enermy = "Pretend I have an enermy object here"
        self.player = Player(self)


##>>> g = Game()
##Pretend I have an enermy object here
##>>> g.player.game.enermy
##'Pretend I have an enermy object here'
##>>> 
## Iin your enermy class, self.game.player will be able to access the player instance, and its properties

Некоторые могут возражать со вторым способом, я тоже вижу проблему с дополнительным шагом. Возможно, кто-то может пролить свет на сравнение между ними.

Комбинационный метод может быть тем, к чему я надеюсь перейти, однако это вызывает некоторую проблему, с которой вам нужно разместить первое место в файле, иначе вы можете установить, что игрок не определен или игра не определена. Хотя я думаю, что это можно решить, разделив 2 класса на разные файлы.

class Player:
    def __init__(self):
        self.game = Game.getInstance()

class Game:
    instance = False

    def __init__(self):
        if self.__class__.instance:
            raise RunTimeError("Game has already been initialized.") # RunTimeError might be a bad choice, but you get the point
        self.__class__.instance = self

    @classmethod
    def getInstance(cls):
        return cls.instance
0

Ошибка, скорее всего, отсутствие конструктора для класса Enemy. Путем выполнения:

self.bob = Enemy(self)

Он ищет функцию __init__(self, arg1) в классе Enemy. Если это не предусмотрено, Python не сможет рассматривать Enemy как "вызываемый", что означает, что он не может использоваться как функция или в этом случае используется для вызова конструктора с одним аргументом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню