大多数pythonic基于某些值来调用类?

时间:2014-07-21 16:45:05

标签: python

假设我有一个动物名称列表,我想将它们映射到这样的特定对象。

class Dog(object)
   __init__(self,name,weight)
   def run()
   ...

class Cat(object)
   __init__(self,name,weight)
   def run()

...

图:

"baily" => Cat
"rocky" => Dog
"daisy" => Cat

我应该使用什么pythonic数据结构来创建这个映射?我希望能够做类似

的事情
animal = map['baily']('baily',33LB)
animal.run()

1 个答案:

答案 0 :(得分:2)

听起来最像Pythonic的方式是继承它们,但是因为你有字符串我们会尽量避免这种情况。

为什么不使用字典?

class Dog(object):
    ...

class Cat(object):
    ...

class_mapping = {"baily":Cat, "rocky":Dog, "daisy":Cat}
animal = class_mapping["baily"]('baily', 33LB)

另一种可能性是构建一个知道可能输入的函数(或者可以对它们执行一些内省)来分配正确的类。例如:

def Meta_Animal(name,*args,**kwargs):
    # I use class naming on this because it always produces a class
    if name.lower() in ['baily','daisy']:
        return Cat(name,*args, **kwargs)
    elif name.lower() in ['rocky']:
        return Dog(name,*args, **kwargs)
    else:
        raise NotImplementedError("That name is not an animal")