Python实例变量访问

2024-06-26 02:02:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个游戏。我有两个类,我想要一个来访问其他实例变量。我不知道该怎么做,也不知道是否有可能。在

这两个类在某种程度上都继承了类gameEngine
游戏引擎<;-游戏
游戏引擎<;-SuperSprite<;-Character<;-敌人
游戏引擎

我的游戏类创建一个对象self.player = Player(self)的实例变量,我希望能够在敌方类中使用它,这样它就可以self.player.x。所以我可以在敌人的类中制造AI,这样它就可以知道我的玩家了。任何建议,如何做到这一点,我的逻辑可能是错误的,所以任何帮助将不胜感激。如果我需要发布我的代码或任何东西,请告诉我。在

或者我一直试图把一个对象传递给一个函数。这样鲍勃就可以在游戏课上得到恩尼美。但我得到一个错误'敌人'对象不可调用。但是它传递它,然后函数打印出信息,然后就死了。但是如果我将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"

Tags: 对象实例函数引擎ltself游戏错误
2条回答

错误很可能是缺少敌方类的构造函数。通过运行:

self.bob = Enemy(self)

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

如果我没听错,你想让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的属性,该属性引用回游戏实例。在

示例:

^{pr2}$

有些人可能反对第二种方法,我也看到了问题的额外步骤。也许有人能对二者的比较有所启示。在

一个组合方法可能是我希望转移到的,但是这会引起一些问题,你需要把哪个放在文件的第一位,否则你可能会得到播放器未定义或游戏没有定义。虽然我认为可以通过将这两个类分成不同的文件来解决。在

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

相关问题 更多 >