Автоматически генерировать методы для подклассов

1

У меня есть несколько десятков классов. Вот два из них:

class Class_A(ClassABC):

    def __init__(self):
        super().__init__()

    def from_B(self, b):
        #do stuff

    def from_C(self, c):
        #do stuff

    #...

    def to_B(self):
        rt = Class_B()
        rt.from_A(self)
        return rt

    def to_C(self):
        rt = Class_C()
        rt.from_A(self)
        return rt

    #...

class Class_B(ClassABC):

    def __init__(self):
        super().__init__()

    def from_A(self, a):
        #do stuff

    def from_C(self, c):
        #do stuff

    def to_A(self):
        rt = Class_A()
        rt.from_B(self)
        return rt

    def to_C(self):
        rt = Class_C()
        rt.from_B(self)
        return rt

    #...

 #class Class_C, Class_D, Class_E, etc,

и вот ABC:

class ClassABC(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def __init__(self):
        #do stuff

Проблема в том, что все методы to_* в подклассах соответствуют одному и тому же шаблону, и им становится утомительно реализовывать их. Я хотел бы автоматически генерировать их в ClassABC если это возможно, но до сих пор я потерпел неудачу. Я также попытался создать декоратор класса для подклассов, но это тоже не сработало. Однако мне удалось автоматически генерировать методы в каждом подклассе с помощью exec(), но я предпочитаю, чтобы ABC генерировал их или использовал декораторы класса. Есть ли способ сделать это?

Примечание: все классы находятся в отдельном модуле

  • 0
    может быть, переименование from_A и from_B во что-то вроде from_self могло бы сделать это проще. Вы можете {'A': Class_A, 'B': Class_B} как {'A': Class_A, 'B': Class_B} чтобы помочь вашему декоратору класса ...
  • 0
    @JBernardo Нет, я не думаю, что это поможет. Я добавил больше в пример кода, чтобы быть более понятным.
Показать ещё 4 комментария
Теги:
python-3.x
generative-programming

1 ответ

0

Прежде всего, ваши методы to_* не будут работать, потому что вам нужно явно включить self в начало списка аргументов, чтобы иметь возможность использовать его в теле метода. Во-вторых, я бы пошел с чем-то похожим на предложение Дж. Бернардо.

def to_class(self, cls):
    rt = cls()
    rt.from_class(self.__class__)
    return rt

def from_class(self, cls):
    #do stuff, with different things happening based on what class cls is; this may be a good place to use a dict of functions with the class or classname as keys
  • 0
    извините, я забыл включить self в to_* . Это что-то меняет? Кроме того, я хотел бы избежать словаря по соображениям производительности.
  • 1
    Вы думаете, что диктат медленнее? Это не так, в любом случае происходит поиск атрибутов.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню