2015-11-26 104 views
0

我是一個新的程序員,試圖做一個簡單的多人遊戲文本冒險。我有一個名爲Situation的課程,其中包含玩家情況發生的屬性(Player課程的一個對象,但現在讓我們假裝它只是代表玩家名字的字符串)以及發生了什麼事情的故事(一個串)。在python中實例化類時可以引用實例屬性嗎?

當我寫這些的情況下,我希望能夠有故事文本取決於玩家,例如,我試圖做這樣的事情:

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

這沒有多大意義,如果你定義這樣的事情,他們可以成爲遞歸。 Haskell可以做這樣的事情,但它可能不是你想要的。 – simonzack

+1

現在str.format()會爲你做這項工作,就像Claudiu寫的那樣。當這個變得更大時,你應該尋找一個模板引擎。 – jhinghaus

回答

1

正如Martijn所說,你不能訪問attribu即將創建的實例的tes,因爲它還不存在。

然而,爲了使實例的方式屬性依賴於另一個實例屬性包括邏輯哪個做到了這一點 - 使用一個實例屬性來計算另一個實例屬性。

在你的情況,而不是通過一個故事串,你可以傳遞一個格式字符串,它會變成到使用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' 
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}") 
相關問題