Как перечислить вложенные классы в python?

Как реализовать функцию, которая перечисляет вложенные классы?

class A(object):
    class B(object):
        pass

    class C(object):
        pass


def enumerate_nested_classes(_class):
    return ()  # need proper implementation instead


assert set(enumerate_nested_classes(A)) == {A.B, A.C}

2 ответа

Решение

Вы можете использовать следующий код:

import types


class A(object):
    class B(object):
        pass

    class C(object):
        pass

def enumerate_nested_classes(_class):
    return [getattr(_class, n) for n in dir(_class) if not n.startswith('__')
            and isinstance(getattr(_class, n), (type, types.ClassType))] 

assert enumerate_nested_classes(A) == [A.B, A.C]

А также print enumerate_nested_classes(A) печать [<class '__main__.B'>, <class '__main__.C'>]

NB. dir(_class) результирующий список отсортирован по алфавиту, поэтому при использовании assert enumerate_nested_classes(A) == [A.B, A.C] лучше использовать: assert sorted(enumerate_nested_classes(A)) == sorted([A.B, A.C]),

inspect.getmembers()в сочетании сinspect.isclass()должно помочь здесь:

classes = [name for name, member_type in inspect.getmembers(A)
           if inspect.isclass(member_type) and not name.startswith("__")]

print(classes)  # prints ['B', 'C']

Обратите внимание, чтоnot name.startswith("__")проверка необходима для исключения__class__ - Я подозреваю, что есть более простой и более питонический способ сделать это, был бы признателен, если бы кто-то указал на это.

Другие вопросы по тегам