Вопрос был закрыт как дубликат для печати всех экземпляров класса
Однако здесь есть два различия. .
- Я хочу создать объект всех экземпляров подкласса.
- Я не могу изменить базовый класс, чтобы собрать все объекты в список. Мне нужен какой-то механизм, чтобы сделать это вне BaseClass
Я новичок в Python (исходя из фон Java) и поэкспериментировал с несколькими вещами. Один из них — получить все подклассы (а также подклассы подклассов) и вызвать функцию для этого объекта подкласса. Функция определена в базовом классе.
Структура модулей Python:
[img]https:// i.sstatic.net/Jph5qQA2.png[/img]
Код в base_class.py
Код: Выделить всё
class BaseClass:
def __init__(self, entity_name):
self.entity_name = entity_name
def get_entity_name(self) -> str:
return self.entity_name
Код: Выделить всё
from test.sub_classes import SubClass1, SubClass2
from test.sub_classes_scanner import SubClassesScanner
sub_class_1 = SubClass1('SubClass_1_test')
sub_class_2 = SubClass2('SubClass_2_test')
print(sub_class_1.get_entity_name())
print(sub_class_2.entity_name)
all_subclasses = SubClassesScanner.get_all_existing_sub_classes()
for subclass in all_subclasses:
print(subclass)
try:
print(subclass.get_entity_name())
except Exception as e:
print(e)
try:
print(subclass.entity_name)
except Exception as e:
print(e)
Код: Выделить всё
from typing import Optional, Type, Set
from test.base_class import BaseClass
from test.sub_classes import SubClass1, SubClass2
class SubClassesScanner:
@staticmethod
def get_all_existing_sub_classes(cls: Optional[Type[BaseClass]]=None,) -> Set[Type[BaseClass]]:
if not cls:
cls = BaseClass
return set(cls.__subclasses__()).union(
[
s
for c in cls.__subclasses__()
for s in SubClassesScanner.get_all_existing_sub_classes(c)
]
)
# return {SubClass1(), SubClass2()}
Код: Выделить всё
BaseClass.get_entity_name() missing 1 required positional argument: 'self'
type object 'SubClass1' has no attribute 'entity_name'
BaseClass.get_entity_name() missing 1 required positional argument: 'self'
type object 'SubClass2' has no attribute 'entity_name'
Что нужно сделать, чтобы все работало так, как задумано? Цель состоит в том, чтобы динамически сканировать все подклассы (их может быть до 100 подклассов) из разных модулей и пакетов (обычно их может быть несколько десятков), вызывать функцию и получать правильный ответ для каждого подкласса.
Подробнее здесь: https://stackoverflow.com/questions/792 ... call-the-f
Мобильная версия