自动生成子类的方法

时间:2011-08-09 22:01:05

标签: python python-3.x generative-programming

我有几十节课。以下是其中两个:

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自动生成它们,但到目前为止我都失败了。我也尝试为子类创建一个类decorater,但这也不起作用。但是,我设法使用exec()自动生成每个子类中的方法,但我宁愿让ABC生成它们或使用类装饰器。有没有办法做到这一点?

注意:所有类都在各自独立的模块中

1 个答案:

答案 0 :(得分:0)

首先,您的to_*方法不起作用,因为您需要在参数列表的开头明确包含self,以便能够在方法体中使用它。其次,我会选择类似于JBernardo的建议。

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