2015-10-17 54 views
-1

當使用戶與騎士戰鬥時,我正在努力創造一個健康/憤怒(變量)下降。我定義了一個叫kingsmen的類,這個類很簡單,並且用於每個騎士,但是我總是被告知我沒有正確地調用這個類。我不確定如何解釋它。以下是班級和騎士的代碼,錯誤消息將位於底部。某些打印間距很奇怪(帶有'''''的打印間距),因爲該網站很困難。 謝謝!如何從一個類調用一個統計到一個函數 - Python

類:

class kingsmen:         

    def __init__(self): 
     self.stats = {} 

    def attributes(self):         
     health=15 
     anger=7 
     self.stats["health"] = 15      #storing default health count 
     self.stats["anger"] = 7 
     return self.stats 
    def warning(self):        #players will see this message when meeting a knight 
     print ('A kingsmen! Prepare for battle!') 
    def noise(self): 
     print ("H e y , i t ' s a v i l l a g e r !")  #have these attributes later. 
    def death(self): 
     if healh == 0: 
      print ('''DEFEATED''') 

騎士:

def rknightOne(kingsmen):   #r stands for random, he will be one of 5 random villains you can face 
    rknightOne=kingsmen() 
    #while health in kingsmen.stats()!= 0 and anger != 0: 
    if action == 'attack': 
     for health in rknightOne.attributes: 
      health=health-1 
      print health 
     print_slowly ('I did not feel a thing. Ha ha ha!') 
     healthDrop(user) 
    elif action == 'mercy': 
     for anger in rknightOne.attributes: 
      anger=anger-1 
     print_slowly ('Huh. I feel something warm inside.') 
    elif action=='run': 
     print_slowly ('Not so fast!') 
    else: 
     print_slowly ("Jeez this guy is looney. I CAN'T UNDERSTAND YOU!") 

錯誤:

Traceback (most recent call last): 
File "C:/Python27/REDEMPTION/Redemption Game V1.py", line 678, in <module> 
    print randomKnight() 
File "C:/Python27/REDEMPTION/Redemption Game V1.py", line 440, in randomKnight 
    print random.choice([rknightOne(kingsmen), rknightTwo(kingsmen), rknightThree(kingsmen), rknightFour(kingsmen), rknightFive(kingsmen)]) 
File "C:/Python27/REDEMPTION/Redemption Game V1.py", line 178, in rknightOne 
for health in rknightOne.attributes: 
TypeError: 'instancemethod' object is not iterable 

它說的是剛剛經歷5個騎士,可以彈出循環隨機函數。這是在情況下,它是有幫助的代碼:

def randomKnight(): 
    print random.choice([rknightOne(kingsmen), rknightTwo(kingsmen), rknightThree(kingsmen), rknightFour(kingsmen), rknightFive(kingsmen)]) 
+0

我建議不要使用'self.stats = {}'和一個'def stats(self)'方法。你應該改變其中一個的名字。一旦清除了當前的錯誤,由於名稱衝突,您很可能會面臨另一個錯誤。 – idjaw

+0

我固定了壓痕。還在習慣這個網站。對不起,現在有什麼是我的IDLE – salexand82m

回答

0

更改此

for health in kingsmen.stats(): 

與下面的語句之一

for health in kingsmen.stats: # if you don't want to call the method 
for health in kingsmen.stats(some_argument): # or if you want to call the method provide arguments 

原因,您收到此錯誤是,你不僅定義

self.stats = {} 

def stats(self) 

在金斯類,所以它是令人困惑的你。

+0

健康kingsmen.stats中出現:得到這個錯誤: 回溯(最近調用最後): 文件「C:/ Python27/REDEMPTION/Redemption Game V1.py 「,line 677,in print randomKnight() 文件」C:/ Python27/REDEMPTION/Redemption Game V1.py「,line 439,in randomKnight print random.choice([rknightOne(kingsmen),rknightTwo(kingsmen) ,rknightThree(kingsmen),rknightFour(kingsmen),rknight5(kingsmen) 'instancemethod'對象不可迭代 – salexand82m

+0

Wh在kingsmen.stats返回是不可迭代的,你試圖在for循環中迭代它。現在,這是另一個錯誤,與您的問題無關。 – ferit

+0

我在「健康」和自我和國王,但他們都沒有運作。如果不是君主,自我或者統計本身,那麼你會通過some_argument表示什麼? – salexand82m

0

隨着代碼的最新修訂版本的出現,您很清楚現在要做什麼。您看到的錯誤消息告訴您無法迭代實例方法。這正是你想要做的。你正試圖循環使用kingsmen.attributes這是你的課堂中的一種方法。你不能這樣做。你的方法實際上是返回一個字典,執行該方法的結果是你可以迭代的東西。所以你實際上想要遍歷調用attributes()的結果。然而,在此之前還有一個問題需要解決,我將在下面解釋。

爲了能夠正確調用屬性,您必須首先實例化您的類(documentation on classes and objects in Python)。

你在做什麼不是執行該方法,此外,沒有實例化類能夠訪問和執行該方法。

要解決這個問題,你行的位置:

for health in kingsmen.attributes: 

您需要首先實例化你的類,然後使用該對象從您的類來調用屬性方法。在實現時返回該屬性方法將返回您正在嘗試迭代的字典。所以,你的代碼應該看起來像這樣:

my_kingsmen = kinsgmen() 
for health in my_kinsgmen.attributes(): 
+0

說實話,我問我的教授出了什麼問題,他告訴我使用self.stats = {},所以我不確定要重命名它,或者我應該用rknightOne調用 – salexand82m

+0

如果你的教授說使用self.stats = {}。然後將你的'def stats'改爲別的東西。 – idjaw

+0

的代碼現在: DEF屬性(個體): 健康= 15 憤怒= 7個 self.stats [ 「健康」] = 15個 self.stats [ 「憤怒」] = 7 錯誤: 文件「 C:/ Python27/REDEMPTION/Redemption Game V1.py「,行179,in rknightOne health = health-1 TypeError:不支持的操作數類型爲 - :'str'和'int' – salexand82m

相關問題