Python - доступ к переменной экземпляра - PullRequest
1 голос
/ 01 мая 2011

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

Оба класса в какой-то момент наследуют класс gameEngine
gameEngine <- Game <br> gameEngine <- SuperSprite <- Персонаж <- Враг <br> gameEngine <- SuperSprite <- Персонаж <- Игрок </p>

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

Это или я пытался передать объект в функцию. Так что Боб может получить врага в игровом классе. Но я получаю сообщение об ошибке «Враг» не вызывается. Тем не менее, он пропускает его, и функция выводит информацию, затем умирает. НО, если я переместу 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"

Ответы [ 2 ]

1 голос
/ 01 мая 2011

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

Есть 2 способа сделать это.Я использую второй метод 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

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

Пример:

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.

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

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 голосов
/ 01 мая 2011

Вероятно, ошибка связана с отсутствием конструктора для класса Enemy. Запустив:

self.bob = Enemy(self)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...