Python - 从导入模块获取类型的类

6 投票
2 回答
5527 浏览
提问于 2025-04-16 18:10

我正在尝试从一个动态命名的文件中导入一个类。这里是我的文件导入器:

def get_channel_module(app, method):
    mod_name = 'channel.%s.%s' % (app, method)
    module = __import__(mod_name, globals(), locals(), [method])
    return module

这个导入器会导入特定的Python文件,比如说some_file.py,内容大概是这样的:

class SomeClassA(BaseClass):
    def __init__(self, *args, **kwargs):
        return

class SomeClassB():
    def __init__(self, *args, **kwargs):
        return

我想做的是只返回从导入的文件中继承自BaseClass的那个类,也就是在这个例子中,SomeClassA。有没有什么办法可以做到这一点呢?

2 个回答

4

一旦你导入了你的模块,就可以遍历它的命名空间,寻找那些是BaseClass子类的类对象。

klasses = [c for c in module.__dict__.values() if isinstance(c, type)]
base_subclasses = [c for c in klasses if issubclass(c, BaseClass]
## or as a single list comprehension
base_subclasses = [c for c in module.__dict__.values() if isinstance(c, type) and issubclass(c, BaseClass)]
8

你可以通过使用 issubclass 来查看你模块中的符号。

def get_subclass(module, base_class):
    for name in dir(module):
        obj = getattr(module, name)
        try:
            if issubclass(obj, base_class):
                return obj
        except TypeError:  # If 'obj' is not a class
            pass
    return None

撰写回答