【问题标题】:Python - Instance Variable AccessPython - 实例变量访问
【发布时间】:2011-05-01 01:13:23
【问题描述】:

我目前正在制作游戏。我有 2 个类,我想要一个访问其他实例变量。我不确定如何执行此操作或是否可行。

两个类在某些时候都继承到类 gameEngine
游戏引擎 游戏引擎 gameEngine

我的 Game 类创建了一个对象 self.player = Player(self) 的实例变量,我希望能够在我的 Enemy 类中使​​用它,以便它可以执行 self.player.x。所以我可以在敌人类中制作人工智能,让它知道我的玩家。关于如何做到这一点的任何建议,我的逻辑可能是错误的,所以任何帮助将不胜感激。如果我需要发布我的代码或任何内容,请告诉我。

那个或者我一直在尝试将一个对象传递给一个函数。所以鲍勃可以在游戏类中获得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"

【问题讨论】:

    标签: python variables object instance


    【解决方案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
    

    第二种方法是我一直在使用的方法。它涉及让 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
    

    有些人可能会反对采用第二种方式,我也看到了额外步骤的问题。也许有人可以对两者之间的比较有所了解。

    一种组合方法可能是我希望采用的方法,但这会引发一些问题,即您需要首先将哪个方法放入文件中,否则您可能会得到 Player not defined 或 Game not defined。虽然我认为可以通过将 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
    

    【讨论】:

      【解决方案2】:

      错误可能是 Enemy 类缺少构造函数。通过运行:

      self.bob = Enemy(self)
      

      它在Enemy 类中查找函数__init__(self, arg1)。如果未提供,Python 将无法将 Enemy 视为“可调用”,这意味着它不能像函数一样使用,或者在这种情况下,不能用于调用带有一个参数的构造函数。

      【讨论】:

        猜你喜欢
        • 2022-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 2017-03-20
        相关资源
        最近更新 更多