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

(Python、Windows)从其他类调用类函数,python,windows,class,function,variables,Python,Windows,Class,Function,Variables,我试图从另一个类调用一个类中的函数。这是我的密码: import os class GameRoom(): msgLine1 = "" msgLine2 = "" msgLine3 = "" msgLine4 = "" msgLine5 = "" def GameStatus(self): while True: os.system('cls') print self.msgLi

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

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()
时显示“Player Go.”。我该怎么做?谢谢你的帮助

之所以发生这种情况,是因为当您调用
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()

同样,这不是你的问题,但是你可能需要考虑改变命名约定(参见:):

< P>这是因为当你调用<代码> GAMEOMO()时,循环码(“播放器去”)< /C> >,你在一个新的实例中调用它:代码> GAMOOM< <代码>。简易修复:

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

同样,这不是你的问题,但是你可能想考虑改变命名约定(参见:):

你面临的一部分问题(也许是你困惑的原因)是你试图使用类变量来保存你的消息,但实际上你没有修改它们。每当您键入

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!

另一个选项是将播放器创建添加到
\uuuu init\uuu
方法(将其分配给
self.player
或实例上的其他名称)。然后,您可以从
GameRoom
中的任意方法访问相同的
Player
实例。或者,如果您希望相同的
播放器
实例可在不同的房间中使用,您甚至可以将其作为
\uuuu init\uuuuu
方法的一个参数。

您面临的部分问题(可能是让您感到困惑的原因)是您试图使用类变量来保存消息,但事实上你并没有修改它们。每当您键入
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!

另一个选项是将播放器创建添加到
\uuuu init\uuu
方法(将其分配给
self.player
或实例上的其他名称)。然后,您可以从
GameRoom
中的任意方法访问相同的
Player
实例。或者,如果希望相同的
Player
实例可在不同的文件室中使用,您甚至可以将其作为
\uuuu init\uuuu
方法的参数。

我将重命名
GameRoom
参数,以避免隐藏类名。另外,为了避免不断加深的递归,我建议从
Player.Go
的末尾删除
GameStatus()
调用,而只返回。然后只需从
GameStatus
中删除
break
行,您就只需要一个循环了。谢谢!现在很好用。我知道命名规则,但我是个懒惰的人或诸如此类的人。抱歉花了这么长时间才回复!我将重命名
GameRoom
参数以避免