在python中实例化类时,我可以引用实例属性吗?

时间:2015-11-26 15:27:10

标签: python

我是一名新程序员,正在尝试进行简单的多人文字冒险。我有一个名为Situation的类,其中包含发生情况的玩家的属性(Player类的对象,但是现在让我们假装它只是一个表示玩家姓名的字符串)以及正在发生的事情的故事(一个字符串)。

当我写这些情况时,我希望能够让故事文本取决于玩家,例如,我正在尝试做这样的事情:

class Situation:
    def __init__(self, player, story):
        self.player = player
        self.story = story

my_story = Situation("Maggie", "once upon a time there was a kid named %s" % (my_story.player))

尝试这一点,我得到一个错误消息“在赋值之前引用的局部变量'my_story'”这是有道理的。我尝试过self.player,但这也行不通。

有没有办法让一个实例属性依赖于另一个?

2 个答案:

答案 0 :(得分:3)

当Python评估语句my_story = Situation(...)时,它必须首先评估参数,因为否则没有任何内容可以传递给Situation()类。 此时没有实例,因为尚未调用该类。 my_story名称的分配仅在创建实例后进行,因此您也不能使用该名称。

所以不,你还不能引用它,因为它还不存在。

您可以先将播放器存储在单独的变量中:

player = 'Maggie'
my_story = Situation(player, "once upon a time there was a kid named %s" % (player,))

或者,您可以将填写模板的职责传递给__init__方法;你可以给它一个带有%s占位符的字符串,例如:

class Situation:
    def __init__(self, player, story):
        self.player = player
        self.story = story % (self.player,)

my_story = Situation("Maggie", "once upon a time there was a kid named %s")

使用名为占位符的方法有更好的方法:

class Situation:
    def __init__(self, player, story):
        self.player = player
        self.story = story % {'player': self.player}

my_story = Situation("Maggie", "once upon a time there was a kid named %(player)s")

我个人在这里使用较新的str.format() method,因为格式更清晰:

class Situation:
    def __init__(self, player, story):
        self.player = player
        self.story = story.format(player=self.player)

my_story = Situation("Maggie", "once upon a time there was a kid named {player}")

答案 1 :(得分:1)

正如Martijn所说,你无法访问要创建的实例的属性,因为它还不存在。

但是,使实例属性依赖于另一个实例属性的方法是包含这样做的逻辑 - 使用一个实例属性来计算另一个实例属性。

在您的情况下,您可以使用str.format()传递一个格式字符串,而不是传递一个故事字符串,以便将转换为故事字符串:

class Situation:
    def __init__(self, player, story_fmt):
        self.player = player
        self.story = story_fmt.format(player=self.player)

situation = Situation("Maggie", "once upon a time there was a kid named {player}")

现在situation.story是:

'once upon a time there was a kid named Maggie'