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

2024-10-03 11:17:41 发布

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

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

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时,行中充满了“这不是一个有效的选择!”通常,他们应该这样做。当我从Player类调用CycleMessages时,所有的行都被清除,而不是显示“Player go.”错误'也不显示。你知道吗

我想当我打电话给Player().Go()时出现“玩家开始”。我该怎么做?谢谢你的帮助!你知道吗


Tags: selfgoosmaindefplayerprintgamestatus
2条回答

这是因为当您调用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)。你知道吗

您所面临的部分问题(可能是让您感到困惑的原因)是您试图使用类变量来保存消息,但实际上并没有修改它们。每当您键入self.variable = something时,您将被赋值给实例变量,即使存在同名的类变量。这是因为虽然您可以通过self访问类变量,但您不能这样分配给它们。你知道吗

可以通过将类变量更精确地命名为GameRoom.variable来避免这种情况,但是我建议完全避免类变量。除了常数,它们很少对任何东西有用。下面是如何设置实例变量的方法:

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

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

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

@kuyan的回答说明了如何避免在Player.Go方法中创建一个新的GameRoom实例,但是您可能也希望避免创建大量的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或其他名称)。然后可以从GameRoom中的任意数量的方法访问相同的Player实例。或者您甚至可以将其作为__init__方法的参数,如果您希望相同的Player实例在不同的房间中可用。你知道吗

相关问题 更多 >