1

Python (>=2.6) クラスにたくさん (数百!) のメソッドがあるとします。今、誰かがそれをサブクラス化したいと思っていますが、基本クラスのメソッドのほとんどは単純な「チューニング」しか必要ないことに気付きました。また、これらのメソッドを調整する方法はほんの一握りです。入力変換を含むもの、出力変換を含むもの、両方を含むものがあります。

より具体的には、オーバーロードされた各メソッドにこの定型コードを追加せずに、基本クラスと特定の変換を適用するメソッドのリスト (リストの) を提供できる継承の (単純な) ソリューションを探しています。

ありがとう、食べて

ファローアップ。
gabo10yf の回答に基づいて、次のような解決策を思いつきました。

class B(object):
    def f1(self, val):
        print '1: ', val
    def f2(self, val):
        print '2: ', val
def decorator(f):
    def g(self, *args, **kwargs):
        print 'entering'
        result= f(self, *args, **kwargs)
    return g

class A(B):
    pass

_overridden= ['f1', 'f2']
def override(cls):
    for name in _overridden:
        setattr(cls, name, decorator(getattr(cls, name).im_func))
override(A)

if __name__== '__main__':
    b= B()
    b.f1(1)
    b.f2(2)
    a= A()
    a.f1(1)
    a.f2(2)

本当に効きそうです。しかし、それはほとんど単純すぎるように感じますが、確かにまだいくつかの不明瞭な問題が含まれているに違いありません? とにかく、私にこれを理解させてくれてありがとう!

4

4 に答える 4

2

何らかの形のアスペクト指向プログラミングを使用することをお勧めします。Logilab ライブラリを使用すると、クラスのすべてのメソッドにラッパーを簡単に配置できます。

于 2011-01-17T23:30:54.430 に答える
2

これが役立つことを願っています:


 # the base class
class B(object):
    def f1(self, val):
        pass
    def f2(self, val):
        pass

def decorator(cls, f): def g(self, *args, **kwargs): # do stuff result = f(self, *args, **kwargs) # do more stuff return g

class A(B): _overridden = ['f1', 'f2'] @classmethod def load(cls): for name in cls._overridden: setattr(name, decorator(getattr(name).im_func))

A.load()

クラスおよび静的メソッドを処理するために、いくつかの変更を行う必要がある場合があります。

于 2011-01-18T04:16:31.713 に答える
0

継承に行く前に、デコレータを検討します。

また、そのクラスのリファクタリングも検討します。何百ものメソッドが「神のアンチパターン」を示唆しています。

于 2011-01-17T22:26:37.457 に答える
0

Python (>=2.6) クラスにたくさん (数百!) のメソッドがあるとします。

クラスの設計が壊れているため、クラスをリファクタリングします。

また、上記のクラスのインスタンスにモンキーパッチを適用することで、指定された結果を簡単に達成できます。

于 2011-01-17T22:26:56.257 に答える