Python:调用其他类方法的最佳方式是什么?
我有以下代码:
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是一个到处都要用的数组,所以在每个类里面都复制一份似乎不太合适。我可能理解错了,我正在慢慢学习面向对象编程,所以谢谢大家的帮助。
4 个回答
我会稍微改动一下全局变量的用法:
# 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(...),这样就能更好地实现单例模式。
只有第一个选择是可行的。在第二个例子中,for room in self.aGame['rooms']
会出错,因为没有地方把 aGame 绑定到 self 上。如果改成 for room in aGame['rooms']
就可以了,但那样每次调用 move()
时都得多传一个 aGame,显得不太方便。
你也可以把它设为全局变量,但最好还是让每个玩家都持有一个 aGame 的实例。如果你需要修改 aGame 并且有多个玩家,那就应该把它定义为全局变量。
另外,稍微挑剔一下,aGame
其实不是数组,而是字典。Python 语言本身没有数组(虽然有些扩展库有)。
在我看来,第一个选项不太好,因为它使用全局变量,没有必要。所以我们要在第二个和第三个选项之间选择。
决定性的因素是你是否想在多个 aGame
值中使用同一个 Player
实例。如果只会有一个值,那么我建议要么把它传给构造函数(也就是你的第二个选项),要么使用gnibbler的想法,把它设为类变量。我个人更倾向于把它传给构造函数,这样测试起来更方便。
如果你想让同一个 Player
实例可以用在多个 aGame
值上,那么第三个选项可能是最干净的做法。