给定一个Python类的字符串,例如my_package.my_module。MyClass,最好的加载方式是什么?
换句话说,我正在寻找一个等效的Class.forName()在Java,函数在Python。它需要工作在谷歌应用程序引擎。
最好是这样一个函数,它接受类的FQN作为字符串,并返回类的引用:
my_class = load_class('my_package.my_module.MyClass')
my_instance = my_class()
给定一个Python类的字符串,例如my_package.my_module。MyClass,最好的加载方式是什么?
换句话说,我正在寻找一个等效的Class.forName()在Java,函数在Python。它需要工作在谷歌应用程序引擎。
最好是这样一个函数,它接受类的FQN作为字符串,并返回类的引用:
my_class = load_class('my_package.my_module.MyClass')
my_instance = my_class()
当前回答
如果你使用的是Django,你可以使用import_string。
是的,我知道OP没有要求django,但我在寻找django解决方案时遇到了这个问题,没有找到一个,并把它放在这里给下一个寻找它的男孩/女孩。
# It's available for v1.7+
# https://github.com/django/django/blob/stable/1.7.x/django/utils/module_loading.py
from django.utils.module_loading import import_string
Klass = import_string('path.to.module.Klass')
func = import_string('path.to.module.func')
var = import_string('path.to.module.var')
请记住,如果你想导入没有.的东西,比如re或argparse,请使用:
re = __import__('re')
其他回答
在谷歌应用引擎中有一个名为import_string的webapp2函数。更多信息请参见:https://webapp-improved.appspot.com/api/webapp2.html
So,
import webapp2
my_class = webapp2.import_string('my_package.my_module.MyClass')
例如,这在webapp2中使用。可以使用处理程序或字符串的路由。
module = __import__("my_package/my_module")
the_class = getattr(module, "MyClass")
obj = the_class()
下面是分享一些我在__import__和importlib上发现的东西,同时试图解决这个问题。
我使用的是Python 3.7.3。
当我在a.b.c模块中找到d类时,
mod = __import__('a.b.c')
mod变量指的是顶部的命名空间a。
为了得到类d,我需要
mod = getattr(mod, 'b') #mod is now module b
mod = getattr(mod, 'c') #mod is now module c
mod = getattr(mod, 'd') #mod is now class d
如果我们试着去做
mod = __import__('a.b.c')
d = getattr(mod, 'd')
我们其实是在找ad
在使用importlib时,我认为库已经为我们完成了递归getattr。当我们使用importlib时。Import_module,我们实际上得到了最深模块的句柄。
mod = importlib.import_module('a.b.c') #mod is module c
d = getattr(mod, 'd') #this is a.b.c.d
从python文档中,这里是你想要的函数:
def my_import(name):
components = name.split('.')
mod = __import__(components[0])
for comp in components[1:]:
mod = getattr(mod, comp)
return mod
简单的__import__不能工作的原因是,任何超过包字符串中第一个点的导入都是你正在导入的模块的属性。因此,像这样的东西是行不通的:
__import__('foo.bar.baz.qux')
你必须像这样调用上面的函数:
my_import('foo.bar.baz.qux')
或者在你的例子中:
klass = my_import('my_package.my_module.my_class')
some_object = klass()
编辑:我在这一点上有点不对头。你基本上想要做的是:
from my_package.my_module import my_class
上面的函数只在fromlist为空时才有必要。因此,适当的调用应该是这样的:
mod = __import__('my_package.my_module', fromlist=['my_class'])
klass = getattr(mod, 'my_class')
好的,对我来说,这就是它工作的方式(我使用Python 2.7):
a = __import__('file_to_import', globals(), locals(), ['*'], -1)
b = a.MyClass()
b是MyClass类的一个实例