2013-05-30 31 views
0

很明顯,我做錯了什麼。我是一個新的python/noob編碼器,所以它可能對你們很顯然,但林不知道該怎麼做。Python字典沒有像我想要的那樣返回新的價值

class hero(): 
    """Lets do some heros shit""" 

    def __init__(self, name="Jimmy", prof="Warrior", weapon="Sword"): 
     """Constructor for hero""" 
     self.name = name 
     self.prof = prof 
     self.weapon = weapon 
     self.herodict = { 
      "Name": self.name, 
      "Class": self.prof, 
      "Weapon": self.weapon 
     } 
     self.herotext = { 
      "Welcome": "Greetings, hero. What is thine name? ", 
      "AskClass": "A fine name %s. What is your class? " % self.herodict['Name'], 
     } 

    def thingy(self, textkey, herokey): 
     n = raw_input(self.herotext[textkey]) 
     self.herodict[herokey] = n 

     if self.herodict[herokey] != "": 
      print self.herodict[herokey] 
     else: 
      self.herodict[herokey] = self.name 
      print self.herodict[herokey] 

    def setHeroName(self): 
     self.thingy("Welcome", 'Name') 

    def setHeroClass(self): 
     self.thingy("AskClass", 'Class') 

所以基本上你運行這個,它設置了一堆默認值。它會詢問一個名字,然後給它用戶輸入,並將Name鍵設置爲你輸入的新值。他們假設採用這個新的關鍵字:值或名稱:(userinput)並在下一句中使用它。但取而代之的是使用默認值'jimmy'。

我需要做什麼?

回答

1

行:

"AskClass": "A fine name %s. What is your class? " % self.herodict['Name'], 

當你創建類,而不是當你以後再打印執行。在創建班級時,self.herodict['Name']設置爲'Jimmy'

當你實際上有一個名字時,你將不得不做一次插值。也許你需要使用可調用,而不是像lambda對象:

self.herotext = { 
    "Welcome": lambda self: "Greetings, hero. What is thine name? ", 
    "AskClass": lambda self: "A fine name %s. What is your class? " % self.herodict['Name'], 
} 

然後叫他們self通過以後:

n = raw_input(self.herotext[textkey](self)) 
+0

我得到你的意思我什麼打印時已經創建的類沒有。但後來我看了一下,有一個問題:在'n = raw_input(self.herotext [textkey])之後# self.herodict [herokey] = n' lines我有一個說'print self.herodict [herokey]'而且它打印正確的新用戶輸入名稱(不是'Jimmy')。這是由於它在相同的def?似乎他們正在訪問兩種不同的詞典;一個是最近的,一個是從對象初次初始化開始的。 –

+0

'__init__'中創建了'herotext'字典,所以當創建實例時。然而'n'局部變量是在'thingy'方法運行時設置的。在同樣的方法中,你將'self.herodict [herokey]'設置爲'n',所以當你打印'self.herodict [herokey]'時,它仍然具有'n'的值,這是用戶剛剛輸入,當你問'raw_input()'輸入。 –

+0

我認爲我現在更好地理解。試圖在我的頭腦中將它視覺化。 'Class inits-> default name set-> setHeroName() - > thingy(newname) - > LOCAL name is set-> LOCAL name is printed-> setHeroClass()然後在開始時已經是init會看到原始的dict默認值,因爲它是在更改之前完成的?我想我應該開始使用文件來存儲這些東西,而不是回讀。或者進入lambda,因爲我以前從未使用過這些。感謝您的耐心和投入,我很感激! –

相關問題