Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 子类的自动生成方法_Python_Python 3.x_Generative Programming - Fatal编程技术网

Python 子类的自动生成方法

Python 子类的自动生成方法,python,python-3.x,generative-programming,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

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

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

也许从_A和从_B重命名为类似于从_self的名称会更容易。你可以用一个类似于{'a':Class_a,'B':Class_B}的dict来帮助你的类装饰师…@JBernardo不,我不认为这会有帮助。为了更清楚,我在示例代码中添加了更多内容。你能给我们一个更好的概念吗?类a与类a和类q之间有什么不同?从类a开始?@cWallenpole没有类a。从类a开始。类q。从类a到类q的转换。好的,类a与类B和类a之间有什么不同。从类a开始,我忘了在to中包含self。这会改变什么吗?另外,出于性能原因,我想避免使用字典。您认为dict速度较慢吗?事实并非如此,反正属性查找就是这样发生的。@agf谢谢,我对Python比较陌生,所以我认为dict会慢一些。