Выполните итерации по подклассам данного класса в данном модуле

Вы не можете.

Поскольку function объявлено как void (*function)(void*), оно всегда возвращает void, так что вам не нужно.

16
задан 4 September 2008 в 18:05
поделиться

4 ответа

Вот один способ сделать это:

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
11
ответ дан 30 November 2019 в 16:50
поделиться

Хотя предложение Quamrana хорошо работает, существует несколько возможных улучшений, я хотел бы предложить сделать его большим количеством pythonic. Они полагаются на использование осмотреть модуля из стандартной библиотеки.

  1. можно избежать вызова getattr при помощи inspect.getmembers()
  2. , попытки/выгоды можно избежать при помощи inspect.isclass()

С теми, можно уменьшить все это до единственного понимания списка, если Вам нравится:

def find_subclasses(module, clazz):
    return [
        cls
            for name, cls in inspect.getmembers(module)
                if inspect.isclass(cls) and issubclass(cls, clazz)
    ]
20
ответ дан 30 November 2019 в 16:50
поделиться

Я могу предложить, чтобы ни один из ответов от 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

причина, я не соглашаюсь с данными ответами, состоит в том, что первое не производит классы, которые являются удаленным подклассом данного класса, и второе включает данный класс.

4
ответ дан 30 November 2019 в 16:50
поделиться

Учитывая модуль foo.py

class foo(object): pass
class bar(foo): pass
class baz(foo): pass

class grar(Exception): pass

def find_subclasses(module, clazz):
    for name in dir(module):
        o = getattr(module, name)

        try: 
             if issubclass(o, clazz):
             yield name, o
        except TypeError: pass

>>> import foo
>>> list(foo.find_subclasses(foo, foo.foo))
[('bar', <class 'foo.bar'>), ('baz', <class 'foo.baz'>), ('foo', <class 'foo.foo'>)]
>>> list(foo.find_subclasses(foo, object))
[('bar', <class 'foo.bar'>), ('baz', <class 'foo.baz'>), ('foo', <class 'foo.foo'>), ('grar', <class 'foo.grar'>)]
>>> list(foo.find_subclasses(foo, Exception))
[('grar', <class 'foo.grar'>)]
1
ответ дан 30 November 2019 в 16:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: