2011-08-09 21 views
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に生成させたり、クラスのdecoratersを使用させたりしました。これを行う方法はありますか?

注:次のことができるようにするために、明示的に引数リストの先頭にselfを含める必要があるため、すべてのクラスは、独自の独立したモジュール内のすべての

+0

「from_A」と「from_B」の名前を「from_self」のように変更すると、簡単にできます。クラスデコレータを助けるために '{'A': 'Class_A、' B ':Class_B}のようなディクテーションを持つことができます。 – JBernardo

+0

@JBernardoいいえ、私はそれが役に立たないと思います。私はもっ​​と明確にするためにサンプルコードにもっと多くを加えました。 – Arlen

+0

Class_A.from_AとClass_q.from_Aの違いは何ですか? – cwallenpoole

答えて

0

まずあり、あなたのto_*方法は仕事に行くされていませんメソッド本体で使用します。第二に、私は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 
+0

申し訳ありませんが、私は 'to_ *'に 'self'を含めるのを忘れていました。それは何か変わるのだろうか?また、パフォーマンス上の理由から辞書を避けたいと思います。 – Arlen

+1

dictが遅いと思いますか?とにかく、それは属性の検索がどうにか起こる方法です。 – agf

+0

@agfありがとう、私はPythonには比較的新しいので、dictは遅くなると思いました。 – Arlen