2

我有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”

4

5 回答 5

4

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

import MBObject
thing  = getattr(MBObject, type)

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

你可以使用我上面给出的代码得到你想要的效果,但是你不能这样做from MBObject import MBObject——当你这样做时,你没有给自己一个模块的引用,只有那个模块中的类。相反,只需做import MBObject,然后通过MBObject.MBObject.

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

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

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

于 2012-11-12T23:41:30.583 回答
3

__import__可以采用额外的参数来准确指定应该导入哪些对象。从这个函数的返回中,您可以获取您想要的任何对象。

source_module = 'MBObject'
object_in_module = 'MBSquareObject'

obj = getattr(__import__(source_module, globals(), locals(), [object_in_module]),
              object_in_module)
于 2012-11-12T23:43:59.970 回答
1

尝试这个:

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

使用此处找到的示例将它们连接在一起:

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

于 2012-11-12T23:44:18.333 回答
1

__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__,它与内置实现基本相同,所以我想你最好使用内置的。

于 2012-11-12T23:49:16.847 回答
0

怎么样:

module = __import__('MSObject.' + 'MBSquareObject')
于 2012-11-12T23:41:17.690 回答