У меня есть несколько десятков классов. Вот два из них:
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 генерировал их или использовал декораторы класса. Есть ли способ сделать это?
Примечание: все классы находятся в отдельном модуле
Прежде всего, ваши методы 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
self
в to_*
. Это что-то меняет? Кроме того, я хотел бы избежать словаря по соображениям производительности.
from_A
иfrom_B
во что-то вродеfrom_self
могло бы сделать это проще. Вы можете{'A': Class_A, 'B': Class_B}
как{'A': Class_A, 'B': Class_B}
чтобы помочь вашему декоратору класса ...