Python:从另一个类调用方法的最佳方法?

时间:2011-01-27 03:20:04

标签: python oop class dictionary global

我有以下代码:

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,谢谢你的帮助。

4 个答案:

答案 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(...)分配给某个地方,并获得更多真正的单例模式。