从字符串导入Python中的模块

从字符串导入Python中的模块,python,Python,我有一个值为“MBSquareObject”的字符串typeMBSquareObject是名为MBObject的文件中的类。我想动态导入MBSquareObject 如果方形对象位于其自己的文件中,则此操作有效: __import__(type) 然而,我想做的是从MBObject导入MBSquareObject的等效。但是,这不起作用: from MBObject __import__(type) 我还能怎么做 编辑:给出的答案假设MBSquareObject是MBObject上的某种对象

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

如果方形对象位于其自己的文件中,则此操作有效:

__import__(type)
然而,我想做的是从MBObject导入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()
错误:名称错误:未定义名称“MBSquareObject”

如何:

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

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

import MBObject
thing  = getattr(MBObject, type)
编辑:一个问题是你给你的模块和类起了相同的名字,这使得在你的代码中很难区分它们。您正在混淆类和模块。你有两个东西叫做MBObject。一个是模块,另一个是该模块内的类。当您从MBObject导入MBObject时,
,您导入了类,但没有给自己模块的引用,这使得随后从同一模块导入第二个类(MBSquartObject)变得很尴尬

通过使用我上面给出的代码,您可以获得想要的效果,但是您不能从MBObject导入MBObject
——当您这样做时,您不给自己模块的引用,只给该模块中的类一个引用。相反,只需执行
导入MBObject
,然后通过
MBObject.MBObject
访问MBObject类即可

如果希望能够引用同一模块中的MBObject类和其他类,而无需在它们前面加上模块名,请为模块指定不同的名称。Python风格的指导原则建议以所有小写字母命名模块,并以MixedCase命名类。因此,将模块命名为mbobject.py。然后你可以做:

import mbobject
from mbobject import MBObject
thing = getattr(mbobject, type)
一般来说,在Python中为模块和类赋予相同的名称不是一个好主意。模块和类是不同的东西,给它们取相同的名称可能会导致类似这样的混淆,您不清楚是处理模块还是处理类。

可以使用额外的参数来指定应该导入哪些对象。通过返回此函数,您可以获取所需的任何对象

source_module = 'MBObject'
object_in_module = 'MBSquareObject'

obj = getattr(__import__(source_module, globals(), locals(), [object_in_module]),
              object_in_module)
试试这个:

module = __import__('MSObject', globals(), locals(), ['MBSquareObject'], -1)
使用以下示例将其连接在一起:


导入功能的完整语法如所述:

此处
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)

从3.1版开始,在Python的最新版本中,有一个模块可以用来实现这一点。尽管我能找到的唯一方法是使用模块的
\uuuu import\uuuu
实现,这基本上与内置实现相同,所以我想您最好使用内置实现。

等等,很抱歉,我应该指定:MBSquareObject是一个类,MBObject的子类。它们只是放在同一个文件中。@mohabitar文件名是什么?如果它被命名为
MBObject.py
,那么它应该可以工作。在这种情况下,
MBObject
指的是模块名,而不是类名。@mohabitar:在这种情况下,您需要编辑您的问题,以便更清楚地解释您要做什么<代码>从MBObject导入MBSquareObject
将从名为
MBObject
的模块导入一个对象(类、数字、字符串等)。您是否知道要从中导入的模块的名称,或者是否也必须动态确定该名称,如果是,如何确定?(也就是说,您是独立于类来确定模块,还是它们以某种方式链接?@DavidZaslavsky文件名为MBObject.py,它有两个类:MBObject和MBSquareObject(MBObject的子类)@mohabitar:在尝试进行动态导入之前,您是否已经导入了
MBObject
类?如果是这样的话,也许不要这样做。(这就是为什么给Python类赋予与其模块相同的名称通常不是一个好主意的原因之一。)请编辑您的问题,以给出代码的完整上下文。
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。导入不会自动添加到全局范围(因此,
from x import y
可以很好地工作)。因此我将使用它而不是
object\u class=eval(type)
?是的。您可以将
getattr
调用包装在
\uuuuu import\uuuuuu
调用周围,以获取模块内的确切对象,而不获取任何其他内容。它在这里都不起作用。我想你不能像那样内联使用
\uuuuu导入
。提供了一个类似的功能解决方案。不,这不是您尝试的。或者至少你在问题中编辑的内容不是任何答案告诉你要做的事情。在你说它不起作用之前,试着使用我给你的代码。
module = __import__('MBObject', globals(), locals(), [type])
the_object = getattr(module, type)