Python:调用其他类方法的最佳方式是什么?

4 投票
4 回答
2978 浏览
提问于 2025-04-16 10:41

我有以下代码:

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 个回答

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(...),这样就能更好地实现单例模式。

0

只有第一个选择是可行的。在第二个例子中,for room in self.aGame['rooms'] 会出错,因为没有地方把 aGame 绑定到 self 上。如果改成 for room in aGame['rooms'] 就可以了,但那样每次调用 move() 时都得多传一个 aGame,显得不太方便。

你也可以把它设为全局变量,但最好还是让每个玩家都持有一个 aGame 的实例。如果你需要修改 aGame 并且有多个玩家,那就应该把它定义为全局变量。

另外,稍微挑剔一下,aGame 其实不是数组,而是字典。Python 语言本身没有数组(虽然有些扩展库有)。

3

在我看来,第一个选项不太好,因为它使用全局变量,没有必要。所以我们要在第二个和第三个选项之间选择。

决定性的因素是你是否想在多个 aGame 值中使用同一个 Player 实例。如果只会有一个值,那么我建议要么把它传给构造函数(也就是你的第二个选项),要么使用gnibbler的想法,把它设为类变量。我个人更倾向于把它传给构造函数,这样测试起来更方便。

如果你想让同一个 Player 实例可以用在多个 aGame 值上,那么第三个选项可能是最干净的做法。

撰写回答