从字符串导入Python中的模块

时间:2012-11-12 23:36:36

标签: python

我有一个字符串type,其值为“MBSquareObject”。 MBSquareObject是名为MBObject的文件中的类。我想动态导入MBSquareObject

如果方形对象位于自己的文件中,则可以:

__import__(type)

但是,我想做的是相当于from MBObject import MBSquareObject。但是,这不起作用:

from MBObject __import__(type)

我怎么能这样做?

编辑:给出的答案是假设MBSquareObject是MBObject上的某种对象,但它只是另一个类。 MBSquareObject是MBObject的子类,因此它们列在同一个文件中。

编辑:由于某种原因,没有一个答案正常。这就是我所拥有的:

# this is imported at the top of the file
from MBObject import MBObject
type = 'MBSquareObject'
__import__('MBObject', globals(), locals(), [type])
object_class = eval(type)
object = object_class()

错误:NameError:未定义名称“MBSquareObject”

5 个答案:

答案 0 :(得分:4)

您的示例表明模块名称MBObject不需要动态访问,只需要内部对象。在这种情况下,你可以做到

import MBObject
thing  = getattr(MBObject, type)

编辑:一个问题是您为模块和类提供了相同的名称,这使得很难在代码中区分它们。你在课程和模块之间感到困惑。你有两个东西叫做MBObject。一个是模块,另一个是模块内的类。当你执行from MBObject import MBObject时,你导入了类,但是没有给自己提供模块的引用,这使得随后从同一个模块导入第二个类(MBSquartObject)变得很尴尬。

你可以使用我上面给出的代码获得你想要的效果,但你必须from MBObject import MBObject ---当你这样做时,你不给自己一个对模块的引用,只是该模块中的类。相反,只需执行import MBObject,然后通过MBObject.MBObject访问MBObject类。

如果您希望能够从同一模块引用MBObject类和其他类,而不使用模块名称作为前缀,请为模块指定其他名称。 Python样式指南建议命名所有小写的模块和MixedCase中的类。因此,将模块命名为mbobject.py。然后你可以这样做:

import mbobject
from mbobject import MBObject
thing = getattr(mbobject, type)

一般来说,在Python中为模块和类赋予相同的名称并不是一个好主意。模块和类是不同的东西,给它们相同的名称会导致这样的混乱,你不清楚你是在处理模块还是类。

答案 1 :(得分:3)

__import__可以使用其他参数来指定应该导入哪些对象。从返回此功能,您可以获取所需的任何对象。

source_module = 'MBObject'
object_in_module = 'MBSquareObject'

obj = getattr(__import__(source_module, globals(), locals(), [object_in_module]),
              object_in_module)

答案 2 :(得分:1)

试试这个:

module = __import__('MSObject', globals(), locals(), ['MBSquareObject'], -1)

使用此处的示例连接在一起:

http://docs.python.org/2/library/functions.html#import

答案 3 :(得分:1)

the documentation中描述了__import__函数的完整语法:

 __import__(name[, globals[, locals[, fromlist[, level]]]])

此处fromlist是要从导入的模块导入的项目列表。像

这样的陈述
 from module import object1, object2

实现类似

module = __import__('module', globals(), locals(), ['object1', 'object2'])
object1 = getattr(module, 'object1')
object2 = getattr(module, 'object2')

所以在你的情况下,你可以使用

module = __import__('MBObject', globals(), locals(), [type])
the_object = getattr(module, type)

在Python的最新版本中,自3.1以来,您可以使用模块importlib来执行此操作。虽然我能找到的唯一方法是使用模块的__import__实现,这与内置实现基本相同,所以我猜你也可以使用内置实现。< / p>

答案 4 :(得分:0)

怎么样:

module = __import__('MSObject.' + 'MBSquareObject')