Python:仅使用 dir() 获取导入模块中定义的类?

Posted

技术标签:

【中文标题】Python:仅使用 dir() 获取导入模块中定义的类?【英文标题】:Python: get only classes defined in imported module with dir()? 【发布时间】:2014-04-29 23:40:04 【问题描述】:

我有一个用 Python 编写的模块。我现在想将它导入另一个脚本并列出我在这个模块中定义的所有类。所以我尝试:

>>> import my_module
>>> dir(my_module)
['BooleanField', 'CharField', 'DateTimeField', 'DecimalField', 'MyClass', 'MySecondClass', 'ForeignKeyField', 'HStoreField', 'IntegerField', 'JSONField', 'TextField', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'datetime', 'db', 'division', 'os', 'struct', 'uuid']

我在 my_module 中定义的仅有的两个类是 MyClassMySecondClass,其他的都是我导入到 my_module 的东西。

我现在希望能够以某种方式获取在my_module 中定义的所有类的列表,而无需获取所有其他内容。有没有办法在 Python 中做到这一点?

【问题讨论】:

虽然可以获得此信息,但尝试这样做是脆弱的,并且会导致不明显的行为。一般来说,反射对于调试非常有用,但在实际生产代码中使用之前应该仔细考虑。 要记录哪些名称可以在外部(公共)使用,您可以定义 __all__ 属性:[cls for name in your_module.__all__ for cls in [getattr(your_module, name)] if inspect.isclass(cls)] 即使在子模块中定义了该类但您希望它可以从顶层模块。试试asyncio 模块,看看我的意思 【参考方案1】:

使用inspect 模块检查活动对象:

>>> import inspect
>>> import my_module
>>> [m[0] for m in inspect.getmembers(my_module, inspect.isclass) if m[1].__module__ == 'my_module']

然后应该可以在该my_module 中定义每个class

【讨论】:

不错。可能if m[1].__module__ == my_module.__name__ 会更好。【参考方案2】:

您可以使用Python Class Browser

import pyclbr
module_name = 'your_module'
module_info = pyclbr.readmodule(module_name)
print(module_info)

for item in module_info.values():
    print(item.name)

它将列出your_module中定义的所有类

【讨论】:

很好,这个模块是默认安装Python还是需要手动安装? @Alexis.Rolland 它来自标准库【参考方案3】:

如果你真的想使用 dir(),这里是:

>>> import module
>>> [eval("module." + objname) for objname in dir(module) if type(eval("module." + objname)) is type]

或(脚本形式)

import module
classes = []
for objname in dir(module):
    obj = eval("module." + objname)
    if type(obj) is type:
        classes.append(obj)
print(classes)

但这使用了“eval”功能,使用起来确实不安全。我会坚持the chosen answer

【讨论】:

以上是关于Python:仅使用 dir() 获取导入模块中定义的类?的主要内容,如果未能解决你的问题,请参考以下文章

Python模块化

python的包和模块

python的包和模块

使用 `importlib` 从 Python 模块中仅导入特定类

python 模块和包管理

Python-import导入上级目录文件