如何使用dictonary创建一个对象?

时间:2017-08-01 09:52:53

标签: python dictionary

我是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)

这是我的代码,如果你能帮助我,我会很高兴,谢谢

3 个答案:

答案 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_dragonnew_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语句那样落空。