我有以下代码:
class Player:
def __init__(self, username, trip, model):
self.username = username
self.trip = trip
self.hp = 100
#### For player moving location/room ####
def Move(self, dest):
if dest == self.loc:
return True
# Check destination room is accessible from current room
for room in aGame['rooms']:
if room['ref'] == self.loc:
for acsroom in room['acs']:
if acsroom == dest:
self.loc = dest
return True
return False
aGame是一个在此类之外定义的数组,因此此代码不起作用。 由于这个类中可能有许多其他函数可能会使用aGame数组,我应该这样做:
class Player:
def __init__(self, username, trip, model, aGame):
self.username = username
self.trip = trip
self.hp = 100
self.aGame = aGame
#### For player moving location/room ####
def Move(self, dest):
if dest == self.loc:
return True
# Check destination room is accessible from current room
for room in self.aGame['rooms']:
if room['ref'] == self.loc:
for acsroom in room['acs']:
if acsroom == dest:
self.loc = dest
return True
return False
或者这样做会更好:
class Player:
def __init__(self, username, trip, model):
self.username = username
self.trip = trip
self.hp = 100
#### For player moving location/room ####
def Move(self, dest, aGame):
if dest == self.loc:
return True
# Check destination room is accessible from current room
for room in aGame['rooms']:
if room['ref'] == self.loc:
for acsroom in room['acs']:
if acsroom == dest:
self.loc = dest
return True
return False
或者我应该让aGame成为一个全局变量(如果是这样,请注意这个类在不同的文件中)?
由于aGame是一个遍布各地的数组,因此必须在每个类中复制它才是正确的。 我可能有这个错误,我正在慢慢学习OOP,谢谢你的帮助。
答案 0 :(得分:3)
在我看来,第一个选项是正确的,因为它没有充分的理由使用全局变量。所以选择在第二个和第三个之间。
决定性功能是,如果您要为多个Player
值使用相同的aGame
实例。如果只有一个值,那么我会将它传递给构造函数(你的选项2)或使用gnibbler的想法使它成为一个类变量。我可能赞成将它传递给构造函数以便于测试。
如果您希望相同的Player
实例可用于多个aGame
值,则选项3可能是实现该目标的最简洁方法。
答案 1 :(得分:0)
只有第一个选择才有效。在第二个示例中,for room in self.aGame['rooms']
将产生错误,因为aGame无处自行绑定。如果是for room in aGame['rooms']
,它会有效,但每次拨打move()
时,您都必须不必要地传递一个游戏。
你也可以把它变成一个全局变量,但最好让每个玩家拥有一个aGame实例。如果您需要更改游戏并拥有多个玩家,则应将其定义为全局变量。
另外,只是挑剔,但aGame
不是一个数组,它是一个字典。 Python语言甚至没有数组(虽然有些扩展可以)。
答案 2 :(得分:0)
每个实例的aGame
是否相同?
然后你可以像这样
class Player:
aGame={'rooms':...}
...
或
Class Player:
...
Player.aGame={'rooms':...}
在课堂上,您仍然可以通过self.aGame
答案 3 :(得分:0)
我在全球范围内使用了一点点变化:
# in game.py or whatever
class Game(object):
instance = {} # this is your aGame array
# in player.py or whatever:
from game import Game
class Player(object):
# ...
def Move(self, dest):
# ...
for room in Game.instance['rooms']:
# ...
或者,您可以将Game设为一个合适的类,在初始化阶段将Game.instance = Game(...)分配给某个地方,并获得更多真正的单例模式。