(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
参数以避免