在python中通过字符串查找类的最简单方法

时间:2018-02-20 11:07:05

标签: python class

getattr(importlib.import_module(__name__), "Some Class")

这是我的方法。 但这是多余的 有更简单的方法吗?
我使用django,我试图将模型的dict传递给名称与模型名称相同的其他类。
粗略地说,这是我的代码 我想在没有if语句的情况下这样做。

instance_list = []
obj_list = [a,b,c,d]
for obj in obj_list:
    dic = model_to_dict(obj)
    if 'Soccer' == obj.__class__.__name__:
        instance_list.append(Soccer(dic))
    elif 'Tennis' == obj.__class__.__name__:
        instance_list.append(Tennis(dic))

2 个答案:

答案 0 :(得分:1)

通过名称从当前模块获取某些东西(不一定是类)的另一种方法:

this_module = sys.modules[__name__]
cls = getattr(this_module, "SomeClass")

答案 1 :(得分:0)

如果关键是让一个模块函数从同一个模块中返回一个类的名称,那么你确实可以用一种不那么复杂的方式重写它:

# mymodule.py
class Foo(object):
    pass

def get_class(name):
    return globals()[name]


# main.py
import mymodule
print(mymodule.get_class("Foo"))

请注意,根据您的使用情况,使用mymodule.get_class()允许查找的类的显式dict可能更安全。如果类名来自用户输入并且您确切知道应该允许哪些类,那么您可能真的想要考虑此选项。

另请注意,对于Django模型类,您还可以使用apps.get_model(app_name, model_name)来从任何应用程序中获取模型。