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

2024-10-01 11:22:21 发布

您现在位置: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数组,因此我应该这样做:

^{pr2}$

还是这样做更好:

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


Tags: inselftrueforreturnifdefusername
3条回答

每个实例的aGame是否相同? 然后你可以像这样把它变成一个类属性

class Player:
    aGame={'rooms':...}
    ...

或者

^{pr2}$

在类中,您仍然可以通过self.aGame访问它

只有第一选择才有效。在第二个例子中,for room in self.aGame['rooms']将产生一个错误,因为任何地方都没有绑定到self。如果它是for room in aGame['rooms'],那么它就可以工作了,但是每次调用move()时,都必须不必要地传递给它。在

您也可以使其成为一个全局变量,但最好让每个玩家持有一个aGame实例。如果需要重新更改并且有多个参与者,则应将其定义为全局变量。在

另外,只是吹毛求疵,但是aGame不是数组,而是字典。Python语言甚至没有数组(尽管有些扩展有数组)。在

在我看来,第一个选择是正确的,因为它使用全局变量没有任何好的理由。所以在第二个和第三个之间选择。在

决定性的特性是您是否要对多个aGame值使用相同的Player实例。如果只有一个值,那么我要么将其传递给构造函数(您的选项2),要么使用gnibbler将其作为类变量的思想。为了便于测试,我可能希望将它传递给构造函数。在

如果您希望同一个Player实例可用于多个aGame值,那么选项3可能是实现这一目标的最干净的方法。在

相关问题 更多 >