我有一个字符串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”
答案 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)
使用此处的示例连接在一起:
答案 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')