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))
答案 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)
来从任何应用程序中获取模型。