如何使用函数的参数来确定要调用哪个类?

2024-04-29 15:30:35 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有一堆怪物职业,其中包括一个地精和一个小鬼:

class Goblin(object):
    def __init__(self):
        self.Name = "Goblin"
        self.HP = random.randint(15,20)
        self.Damage = random.randint(5,10)

class Imp(object):
        def __init__(self):
            self.Name = "Imp"
            self.HP = random.randint(5,10)
            self.Damage = random.randint(2,5)

我们有一个创建怪物的函数,其中“Type”是被创建的怪物的类型:

def GenerateCharacter(Type, Number):

    i=0
    while i < (Number):
        TempChar = #what do I put here so it knows to create Goblins if I do GenerateCharacter(Goblin, 10)

        Character_List.append(TempChar)
        i = i + 1

如果函数的类型参数是“Goblin”(类的名称),如何使放入TempChar的类成为Goblin?所以如果我生成一个字符(X,10),它就生成TempChar=X()??你知道吗

如果我做GenerateCharacter(Goblin,10),我希望它生成10个Goblin类实例并附加到Character\u列表,但是如果我做GenerateCharacter(Imp,10),我希望它做10个Imp。你知道吗


Tags: nameselfobjectinitdefrandomclasshp
2条回答

假设要以字符串形式传入类名,请尝试以下操作:

def GenerateCharacter(Type, Number):
    i=0
    while i < (Number):
        if Type == "Goblin":
            TempChar = Goblin()
        elif Type == "Imp":
            TempChar = Imp()
        # Etc. for every type of monster you have 
        Character_List.append(TempChar)
        i += 1

也许有更好的方法可以做到这一点,将Goblin和Imp类型封装在一个Monster类中,这可能会使您的代码更易于维护。有关更多信息和示例,请参见此处:http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Factory.html

编辑:这里更接近你想要的:

list_of_monsters = []

class Foo:
    def __init__(self):
        print "foo created"

class Bar:
    def __init__(self):
        print "bar created"

class Fubar:
    def __init__(self, num, word):
        print "Fubar created"
        self.number = num
        self.phrase = word

def create_monster(class_name, *args):
    local_class = class_name(*args)
    list_of_monsters.append(local_class)

create_monster(Foo)
create_monster(Bar)

# You can even pass in arguments:
create_monster(Fubar, 1, "Hello")

print list_of_monsters

如果你检查这段代码,你会看到怪物列表将包含3个对象,每个类一个。你知道吗

如果将其作为字符串传递,则可以使用globals()方法,该方法返回全局命名空间中所有变量的字典

def GenerateCharacter(Type, Number):
    Character_List = []
    for i in range(Number):
        name = Type
        TempChar = globals()[name](name)

        Character_List.append(TempChar)

    return Character_List

另外,在循环外创建字符列表并使用for循环,因为它更干净,而且您可以避免自己增加循环的计数器。你知道吗

相关问题 更多 >