Есть ли способ "однострочно" это с помощью понимания списка / набора?
Вот мой метод для рекурсивного получения всех подклассов:
@classmethod
def get_subclasses(cls):
subclasses = set()
for subclass in cls.__subclasses__():
subclasses.add(subclass)
subclasses.update(subclass.get_subclasses())
return subclasses
Есть ли способ сделать его однострочным? Что-то вроде:
return set(subclass.__subclasses__() for subclass in self.__subclasses__())
3 ответа
Решение
Возможна однострочность, но я думаю, что сохранение двух строк сохраняет ясность:
subclasses = set(cls.__subclasses__())
return subclasses + set(sc.get_subclasses() for sc in subclasses)
Это одна логическая строка, разделенная на две строки источника для большей читабельности:
@classmethod
def get_subclasses(cls):
return set(cls.__subclasses__()) | {g for s in cls.__subclasses__()
for g in s.get_subclasses()}
Это возвращает имя всех подклассов, наследуемых от Базового класса.
print([cls.__name__ for cls in vars()['Base'].__subclasses__()])