0

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

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通过自己打电话时,这些行填满了“这不是一个有效的选择!” 通常,就像他们应该的那样。当我CycleMessagesPlayer课堂上打电话时,所有的行都清除了,而不是显示“玩家去。”。“错误”也不显示。

我想要“玩家去”。当我打电话时出现Player().Go()。我该怎么做呢?我很感激任何帮助!

4

2 回答 2

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)。

于 2012-12-03T02:22:28.383 回答
1

您面临的部分问题(也许是它让您感到困惑的原因)是您试图使用类变量来保存您的消息,但实际上您并没有修改它们。每当您键入self.variable = something时,您都将分配给一个实例变量,即使存在同名的类变量也是如此。这是因为虽然您可以通过 访问类变量self,但不能以这种方式分配给它们。

您可以通过更准确地将类变量命名为 来避免这种情况GameRoom.variable,但我建议完全避免使用类变量。除了常量之外,它们很少有用。以下是如何使用实例变量设置与现在相同的东西:

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

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

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

@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实例上的其他名称)。然后,您可以PlayerGameRoom. __init__或者,如果您希望同一个Player实例在不同的房间中可用,您甚至可以将其作为方法的参数。

于 2012-12-03T02:59:36.723 回答