我是一名新程序员,正在尝试进行简单的多人文字冒险。我有一个名为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,但这也行不通。
有没有办法让一个实例属性依赖于另一个?
答案 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'