Код Python для получения всех объектов подкласса данного базового класса и вызова функции, определенной в базовом классеPython

Программы на Python
Ответить
Anonymous
 Код Python для получения всех объектов подкласса данного базового класса и вызова функции, определенной в базовом классе

Сообщение Anonymous »

Изменить:
Вопрос был закрыт как дубликат для печати всех экземпляров класса
Однако здесь есть два различия. .
  • Я хочу создать объект всех экземпляров подкласса.
  • Я не могу изменить базовый класс, чтобы собрать все объекты в список. Мне нужен какой-то механизм, чтобы сделать это вне 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
Код в sub_classes.py

Код: Выделить всё

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)

Код в sub_classes_scanner.py

Код: Выделить всё

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()}
Когда я запускаю код test_module.py, я получаю следующий результат

Код: Выделить всё


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'
Однако непосредственное создание объекта и вызов функции get_entity_name() работает нормально без ошибок (т. е. печатает имя объекта, переданное в качестве параметра).
Что нужно сделать, чтобы все работало так, как задумано? Цель состоит в том, чтобы динамически сканировать все подклассы (их может быть до 100 подклассов) из разных модулей и пакетов (обычно их может быть несколько десятков), вызывать функцию и получать правильный ответ для каждого подкласса.

Подробнее здесь: https://stackoverflow.com/questions/792 ... call-the-f
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»