为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中,如何获取特定文件中定义的类列表?

在 Python 中,如何获取特定文件中定义的类列表?

料青山看我应如是 2021-11-30 16:45:58
如果文件myfile.py包含:class A(object):  # Some implementationclass B (object):  # Some implementation我如何定义一个方法,以便在给定的myfile.py情况下返回 [A, B]?这里,A 和 B 的返回值可以是类的名称或类的类型。(i.e. type(A) = type(str) or type(A) = type(type))
查看完整描述

3 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

您可以同时获得:

import importlib, inspect
for name, cls in inspect.getmembers(importlib.import_module("myfile"), inspect.isclass):

您可能还想检查:

if cls.__module__ == 'myfile'


查看完整回答
反对 回复 2021-11-30
?
当年话下

TA贡献1890条经验 获得超9个赞

万一它帮助别人。这是我使用的最终解决方案。此方法返回在特定包中定义的所有类。


我将 X 的所有子类保存在特定文件夹(包)中,然后,使用此方法,我可以加载 X 的所有子类,即使它们尚未导入。(如果它们尚未导入,则无法通过 访问它们__all__;否则事情会容易得多)。


import importlib, os, inspect


def get_modules_in_package(package_name: str):

    files = os.listdir(package_name)

    for file in files:

        if file not in ['__init__.py', '__pycache__']:

            if file[-3:] != '.py':

                continue


            file_name = file[:-3]

            module_name = package_name + '.' + file_name

            for name, cls in inspect.getmembers(importlib.import_module(module_name), inspect.isclass):

                if cls.__module__ == module_name:

                    yield cls


查看完整回答
反对 回复 2021-11-30
?
HUWWW

TA贡献1874条经验 获得超12个赞

这有点冗长,但您首先需要将文件作为模块加载,然后检查其方法以查看哪些是类:


import inspect

import importlib.util


# Load the module from file

spec = importlib.util.spec_from_file_location("foo", "foo.py")

foo = importlib.util.module_from_spec(spec)

spec.loader.exec_module(foo)


# Return a list of all attributes of foo which are classes

[x for x in dir(foo) if inspect.isclass(getattr(foo, x))]


查看完整回答
反对 回复 2021-11-30
  • 3 回答
  • 0 关注
  • 263 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信