(Python,Windows)从其他类调用类函数

时间:2012-12-03 01:45:57

标签: python windows class function variables

我正在尝试从另一个类调用一个类中的函数。这是我的代码:

import os

class GameRoom():

    msgLine1 = ""
    msgLine2 = ""
    msgLine3 = ""
    msgLine4 = ""
    msgLine5 = ""

    def GameStatus(self):
        while True:
            os.system('cls')
            print self.msgLine1
            print self.msgLine2
            print self.msgLine3
            print self.msgLine4
            print self.msgLine5 + "\n"
            print "Do what?\n"
            userDecision = raw_input()
            if userDecision.upper() == "GO":
                Player().Go()
                break
            else:
                self.CycleMessages("That's not a valid choice!")

    def CycleMessages(self,newMsg="error"):
        self.msgLine5 = self.msgLine4
        self.msgLine4 = self.msgLine3
        self.msgLine3 = self.msgLine2
        self.msgLine2 = self.msgLine1
        self.msgLine1 = newMsg

class Player():
    def Go(self):
        GameRoom().CycleMessages("Player goes.")
        GameRoom().GameStatus()

def main():
    GameRoom().GameStatus()

if __name__ == '__main__':
    main()

当我通过自己调用CycleMessages时,这些线条充满了'那不是一个有效的选择!'通常,他们应该这样。当我从CycleMessages类调用Player时,所有行都清除,而不是显示'Player goes。'。 “错误”也不会显示。

我想'玩家去。'当我打电话给Player().Go()时出现。我该怎么做呢?我感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

这种情况正在发生,因为当您致电GameRoom().CycleMessages("Player goes.")时,您正在GameRoom的新实例上调用它。轻松修复:

class GameRoom():

    def GameStatus(self):
        ...
            if userDecision.upper() == "GO":
                # Pass `Player` this instance of `GameRoom`
                Player().Go(self)
                break
            else:
                self.CycleMessages("That's not a valid choice!")

class Player():

    def Go(self, game):
        # And here, call `CycleMessages` on the passed instance of `GameRoom`.
        game.CycleMessages("Player goes.")
        game.GameStatus()

此外,这不是您的问题,但您可能需要考虑更改命名约定(请参阅:PEP8)。

答案 1 :(得分:1)

您面临的部分问题(也许是您感到困惑的原因)是您尝试使用类变量来保存邮件,但实际上您并未修改它们。无论何时键入self.variable = something,您都将分配给实例变量,即使存在具有相同名称的类变量也是如此。那是因为虽然您可以通过self访问类变量,但您无法以这种方式分配它们。

您可以通过将类变量更精确地命名为GameRoom.variable来避免这种情况,但我建议完全避免使用类变量。它们对常数以外的任何东西都很少有用。以下是您可以使用实例变量设置相同的内容:

class GameRoom(object):
    def __init__(self):
        self.message1 = ""
        self.message2 = ""
        # etc...

其余代码可以是相同的(它已经在操作实例变量)。

一旦你开始使用实例变量,你遇到的麻烦就是你想要访问他们的方法时创建一个新的类实例。也就是说,GameRoom一遍又一遍地创建新的Player实例,Player类在每次移动后创建新的GameRoom实例。这通常不是你想要做的。相反,您可能只想创建每个实例,并继续重用它们。

@ kuyan的回答显示了如何避免在GameRoom方法中创建新的Player.Go实例,但您可能希望避免创建大量Player个实例(特别是如果您'稍后会在Player课程中发生任何复杂的事情。)

我会这样做:

def GameStatus(self):
    player = Player()    # create a Player instance in a local variable

    # ...

    if userDecision.upper() == "GO":
        player.Go(self)  # use the variable!

另一种选择是将玩家创建添加到__init__方法(将其分配给self.player或实例上的其他名称)。然后,您可以从Player中的任意数量的方法访问相同的GameRoom实例。或者,如果您希望在不同的房间中使用相同的__init__实例,您甚至可以将其作为Player方法的参数。