2017-08-01 59 views
0

我是新的在stackoverflow,我想我的第一個問題在這個代碼中我試圖寫在python學習對象的問題。 我想通過字典調用對象的創建。 我的目的是創建一個對象得數,比如我有字典newch = {1 : Character.new_dragon(), 2 : Character.new_goblin()},當我打電話Player1 = newch[1]應該創建一個新的龍(@classmethod new_dragon)並將其分配給PLAYER1如何使用dictonary創建對象?

的問題是,當我運行該程序,Character.new_dragon()Character.new_goblin()被自動調用(我把控制打印),但是當我在請求「哪個播放器?」之後寫入「DRAGO」?功能沒有所謂,因爲沒有控制打印

import random 

class Character: 
    def __init__(self,idd,height,weight,att,defe): 
     self.idd=idd 
     self.height=height 
     self.weight=weight 
     self.att=att 
     self.defe=defe 


    @classmethod 
    def new_goblin(cls): 
     print('newgoblin') 
     return cls(1,getr(1,1.5,0.1),getr(40,60,0.5),getr(5,15,1),getr(6,10,1)) 

    @classmethod 
    def new_dragon(cls): 
     print('newdrago') 
     return cls(2,getr(20,30,1),getr(500,2000,5),getr(50,150,3),getr(20,100,3)) 


def getr(start,stop,step):   #returns float 
    x=random.randint(1, 1000) 
    random.seed(x) 
    return random.randint(0, int((stop - start)/step)) * step + start 


play={1:'p1', 2:'p2', 3:'p3', 4:'p4'} #dict for players 
newch={1:Character.new_dragon(),2:Character.new_goblin()} ############This doesn't work 


i=1  
while True: 
    char=input("which player? Drago or Goblin?").upper() 
    if(char=="DRAGO"): 
     play[i]=newch[1] #here i try to call Character.new_dragon() 
     i+=1 
     break 
    elif(char=="GOBLIN"): 
     play[i]=newch[2] 
     i+=1 
     break 
    print("write \'Drago\' or \'Goblin\'") 

print(play[1].height, play[1].weight, play[1].att, play[1].defe) 

這裏是我的代碼,如果你能幫助我,我會非常高興,感謝

+0

非常感謝大家! :) – Matte

+0

你的休息時間阻止更多玩家選擇他們的角色。在下面看到我對Turn的回答的評論。你還應該問「哪個角色?」,而不是「哪個角色」。提議的另一種選擇是將輸入的結果發送到一個函數,該函數將該數字作爲if else樹的參數來調用函數。所以你不會有這個問題。 –

+0

是的,我知道,我會在一段時間內實現這個功能,謝謝 – Matte

回答

3

當您調用Character.new_dragon()時,會立即創建新對象,然後將對象存儲在字典中。

相反,您不能將對象存儲在字典中,而是將其創建的函數。該功能將是Character.new_dragon(不含())。 play[i]=newch[1]()

完整代碼:

import random 

class Character: 
    def __init__(self,idd,height,weight,att,defe): 
     self.idd=idd 
     self.height=height 
     self.weight=weight 
     self.att=att 
     self.defe=defe 


    @classmethod 
    def new_goblin(cls): 
     print('newgoblin') 
     return cls(1,getr(1,1.5,0.1),getr(40,60,0.5),getr(5,15,1),getr(6,10,1)) 

    @classmethod 
    def new_dragon(cls): 
     print('newdrago') 
     return cls(2,getr(20,30,1),getr(500,2000,5),getr(50,150,3),getr(20,100,3)) 


def getr(start,stop,step):   #returns float 
    x=random.randint(1, 1000) 
    random.seed(x) 
    return random.randint(0, int((stop - start)/step)) * step + start 


play={1:'p1', 2:'p2', 3:'p3', 4:'p4'} #dict for players 
newch={1:Character.new_dragon,2:Character.new_goblin} ############This doesn't work 


i=1  
while True: 
    char=input("which player? Drago or Goblin?").upper() 
    if(char=="DRAGO"): 
     play[i]=newch[1]() #here i try to call Character.new_dragon() 
     i+=1 
     break 
    elif(char=="GOBLIN"): 
     play[i]=newch[2]() 
     i+=1 
     break 
    print("write \'Drago\' or \'Goblin\'") 

print(play[1].height, play[1].weight, play[1].att, play[1].defe) 

這工作,但我不會說這是最好的編碼風格然後當玩家選擇角色,你可以調用該函數。很難僅從這段代碼中判斷,但使用Character類的Drago和Goblin子類並在該字典中存儲這些類的type可能是一個更好的主意。

2

當你初始化字典這樣:

newch={1:Character.new_dragon(),2:Character.new_goblin()}

要綁定(1和2)連接到返回值的new_dragon和new_goblin functi的附件。您需要綁定這些功能(不需要調用它們),如下所示:

newch={1:Character.new_dragon,2:Character.new_goblin} 請注意,沒有括號!

然後,當你創建的球員,你執行像這樣的功能:

play[i]=newch[1]()注意這裏我們有括號!

此外,如果我可以建議這裏的代碼的改進:

if(char=="DRAGO"): 
    play[i]=newch[1]() 
    i+=1 

爲了避免if語句,您可以創建一個字符串映射:

newch={"DRAGO":Character.new_dragon,"GOBLIN":Character.new_goblin}

,創造只需致電

play[i]=newch[char]()

要處理錯誤,只需添加一個if語句,檢查char字符串是否在使用字典鍵的列表中。

2

newch={1:Character.new_dragon(),2:Character.new_goblin()}

由於這是寫的,在創建字典時new_dragonnew_goblin函數被調用。這就是爲什麼你看到它們每次運行你的程序時都會「自動」運行。

如果改爲申報像字典:

newch={1:Character.new_dragon ,2:Character.new_goblin}

後來又碰到這樣的:

if(char=="DRAGO"): 
    play[i]=newch[1]() 

(注意newch[1]後的括號),你應該得到你想要的。

順便說一下,那些break聲明是沒有必要的。 If/elif/else鏈不像其他語言中的switch語句那樣通過。

+0

我不會說他們是無用的,因爲他們幫助擺脫了時間塊。但另一方面,你無法留在這個區塊內爲其他玩家選擇角色。我會將與玩家人數相對應的變量與我進行比較,看看是否所有人都有機會選擇他們的角色。 –

+1

是的,你是對的@AndoJurai。 – Turn