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 中定义的仅有的两个类是 MyClass
和 MySecondClass
,其他的都是我导入到 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() 获取导入模块中定义的类?的主要内容,如果未能解决你的问题,请参考以下文章