我是stackoverflow中的新手,我想在这段代码中提出我的第一个问题,我试图编写以便在python中学习对象。
我试图通过字典调用对象的创建。
我的目的是通过一个数字创建一个对象,例如我有字典newch = {1 : Character.new_dragon(), 2 : Character.new_goblin()}
,当我调用Player1 = newch[1]
时,它应该创建一个新的龙(@classmethod new_dragon)并将其分配给Player1
问题在于,当我运行程序时,会自动调用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 :(得分:3)
当您调用Character.new_dragon()
时,会立即创建新对象,然后将该对象存储在dict中。
相反,您无法将对象存储在dict中,而是存储创建它的函数。该函数为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
存储在该字典中可能是个更好的主意。
答案 1 :(得分:2)
当您以这种方式初始化字典时:
newch={1:Character.new_dragon(),2:Character.new_goblin()}
您将键(1和2)绑定到new_dragon和new_goblin函数的返回值。你需要绑定函数(不调用它们),如下所示:
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
字符串是否在带有dict键的列表中。
答案 2 :(得分:2)
newch={1:Character.new_dragon(),2:Character.new_goblin()}
编写本文时,创建字典时会调用new_dragon
和new_goblin
函数。这就是为什么每次运行程序时都会“自动”运行它们的原因。
如果您改为宣布dict:
newch={1:Character.new_dragon ,2:Character.new_goblin}
后来有类似的东西:
if(char=="DRAGO"):
play[i]=newch[1]()
(注意newch[1]
之后的括号)你应该得到你想要的东西。
顺便说一句,那些break
语句不是必需的。 If / elif / else链不像其他语言中的switch语句那样落空。