Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.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:仅获取在导入模块中使用dir()定义的类?_Python_Class_Import_Module - Fatal编程技术网

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

Python:仅获取在导入模块中使用dir()定义的类?,python,class,import,module,Python,Class,Import,Module,我有一个用Python编写的模块。现在我想将它导入到另一个脚本中,并列出我在此模块中定义的所有类。所以我试着: >>> import my_module >>> dir(my_module) ['BooleanField', 'CharField', 'DateTimeField', 'DecimalField', 'MyClass', 'MySecondClass', 'ForeignKeyField', 'HStoreField', 'IntegerFie

我有一个用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']
我在我的_模块中定义的两个类是
MyClass
MySecondClass
,其他的都是我导入到
myu模块中的东西


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

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

>>> import inspect
>>> import my_module
>>> [m[0] for m in inspect.getmembers(my_module, inspect.isclass) if m[1].__module__ == 'my_module']
这样就可以了,在
my_模块
中定义每个

如果您确实想使用dir(),它将列出您的_模块中定义的所有类,如下所示:

>>> import module
>>> [eval("module." + objname) for objname in dir(module) if type(eval("module." + objname)) is type]
或(脚本格式)


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

虽然有可能获得这些信息,但尝试这样做是脆弱的,会导致不明显的行为。一般来说,反射对于调试非常有用,但在实际生产代码中使用之前应该非常仔细地考虑。要记录哪些名称可以在外部(公共)使用,可以定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
即使在子模块中定义了类,但您希望它可以从顶级模块中获得,它也可以工作。用
asyncio
module试试看,看看我的意思是什么,这个模块默认是用Python安装的,还是需要手动安装?@Alexis.Rolland它来自标准libraryNice。如果m[1],则可能
。\uuuuu模块\uuuuu==my\u模块。\uuuu名称\uuuuu
会更好。
>>> 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)