Как перечислить вложенные классы в 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__
- Я подозреваю, что есть более простой и более питонический способ сделать это, был бы признателен, если бы кто-то указал на это.