1

私は数十のクラスを持っています。そのうちの2つは次のとおりです。

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にメソッドを生成させるか、クラスデコレーターを使用させています。これを行う方法はありますか?

注:すべてのクラスは独自の個別のモジュールにあります

4

1 に答える 1

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
于 2011-08-10T02:43:32.643 に答える