迭代给定模块中给定类的子类

16 python oop

在Python中,给定模块X和类Y,如何迭代或生成模块X中存在的Y的所有子类的列表?

run*_*neh 20

虽然Quamrana的建议工作得很好,但我想提出一些可能的改进,以使其更加pythonic.他们依赖于使用标准库中的inspect模块.

  1. 您可以使用避免getattr调用 inspect.getmembers()
  2. 使用可以避免try/catch inspect.isclass()

有了这些,如果您愿意,可以将整个事情简化为单个列表理解:

def find_subclasses(module, clazz):
    return [
        cls
            for name, cls in inspect.getmembers(module)
                if inspect.isclass(cls) and issubclass(cls, clazz)
    ]
Run Code Online (Sandbox Code Playgroud)

  • -1:代码不起作用.纠正它是:`cls for name,cls in inspect.getmembers(module)` (2认同)

Chr*_*Lee 11

这是一种方法:

import inspect

def get_subclasses(mod, cls):
    """Yield the classes in module ``mod`` that inherit from ``cls``"""
    for name, obj in inspect.getmembers(mod):
        if hasattr(obj, "__bases__") and cls in obj.__bases__:
            yield obj
Run Code Online (Sandbox Code Playgroud)


qua*_*ana 5

我是否可以认为 Chris AtLee 和 zacherates 的答案都不满足要求?我认为对 zacerates 答案的修改更好:

def find_subclasses(module, clazz):
    for name in dir(module):
        o = getattr(module, name)
        try:
            if (o != clazz) and issubclass(o, clazz):
                yield name, o
        except TypeError: pass
Run Code Online (Sandbox Code Playgroud)

我不同意给定答案的原因是,第一个不产生作为给定类的远距离子类的类,第二个包含给定类。