Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代在动态导入的模块中定义的类_Python_Introspection - Fatal编程技术网

Python 迭代在动态导入的模块中定义的类

Python 迭代在动态导入的模块中定义的类,python,introspection,Python,Introspection,我有一个动态导入的子包中的模块;如何迭代它包含的类 我一直在导入模块并列出如下名称: package = current_module.__name__ package = package[:package.rindex(".")] # get the package package = "%s.sub.%s"%(package,name) # make the name of the child print "(loading package %s)"%package module = __i

我有一个动态导入的子包中的模块;如何迭代它包含的类

我一直在导入模块并列出如下名称:

package = current_module.__name__
package = package[:package.rindex(".")] # get the package
package = "%s.sub.%s"%(package,name) # make the name of the child
print "(loading package %s)"%package
module = __import__(package) # this succeeds
for name,obj in inspect.getmembers(module):
    print name,type(obj)
这仅打印模块属性,而不打印模块定义的类类型:

__builtins__ <type 'dict'>
__doc__ <type 'NoneType'>
__file__ <type 'str'>
__name__ <type 'str'>
__package__ <type 'NoneType'>
__path__ <type 'list'>
imported_package <type 'module'>
\uuuu内置
__博士
__文件
__姓名
__包裹
__路径
进口包装
更新

似乎我的类不在
\uu dict\uu
中,除非
fromlist
非空!但是,from列表中的值似乎没有得到验证<代码>[“”]似乎工作正常,突然类出现了

有人能解释为什么会这样吗


(标准ubuntu python 2.7.1+(r271:86832)

示例:要创建将名称映射到类的dict:

dict([(name, cls) for name, cls in mod.__dict__.items() if isinstance(cls, type)])

其中mod是加载的模块

如果您在要导入的模块中定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>定义了将导出哪些符号

map(module.__dict__.get, module.__all__)

除非导入有一个fromlist子句;问题已更新,否则这不起作用。哦,还有一个次要的问题,我认为您需要在一个try块中创建issubclass?(第一)关于fromlist,您是对的:我通常使用
[None]
。不知道为什么需要这样做。(第二)不,我真正的意思是
isinstance
,而不是
issubclass
,没有
try
。每个类也是类型为“type”的对象。
fromlist
需要获得您想要的,如果并且仅当您导入的模块不是顶级模块(或者更确切地说,它不包含点)。如果导入的模块名称包含点,
\uuuuuu import\uuuuu
调用将返回最左侧的模块对象(如果fromlist不存在),最右侧的模块对象(如果fromlist存在)。比较
\uuuu import\uuuu('pkg.mod')。\uuuuu name\uuuu
\uuuu import\uu('pkg.mod',fromlist=“).名称:第一个是
pkg
,第二个是
mod