2 種類の MixIn を行うエレガントな方法を見つける必要があります。
初め:
class A(object):
def method1(self):
do_something()
-> -> -つまり、基本的に古い関数を「ラップ」しMixInClass
ます。これに対する適切な解決策が存在するに違いないと確信しています。method1
do_other()
A.method1()
do_smth_else()
2番:
class B(object):
def method1(self):
do_something()
do_more()
この場合、 と の間にMixInClass2
自分自身を挿入できるようにしたいと考えています。つまり、-> ->です。おそらくこれには変更が必要であることを理解しています-それは大丈夫です、これを達成するための最も簡単な方法を探しているだけです.do_something()
do_more()
do_something()
MixIn.method1
do_more()
class B
これらはかなり些細な問題であり、実際に解決しましたが、私の解決策は汚染されています。
の呼び出しを使用self._old_method1 = self.method1(); self.method1() = self._new_method1();
して記述することにより、最初の 1 つ。_new_method1()
_old_method1()
問題: 複数の MixIn がすべて _old_method1 に名前変更され、洗練されていません。
2 番目の MixIn は、ダミー メソッドを作成し、call_mixin(self): pass
それを呼び出しと定義の間に挿入することで解決されましたself.call_mixin()
。これもエレガントではなく、複数の MixIn で壊れます。
何か案は?
Boldewyn のおかげで、最初のソリューションに対するエレガントなソリューションを見つけました (元のコードを変更せずにオンザフライでデコレータを作成できることを忘れていました)。
class MixIn_for_1(object):
def __init__(self):
self.method1 = self.wrap1(self.method1)
super(MixIn_for_1, self).__init__()
def wrap1(self, old):
def method1():
print "do_other()"
old()
print "do_smth_else()"
return method1
2番目のアイデアをまだ探しています(この場合のように、外部ではなく古いメソッドの内部に注入する必要があるため、このアイデアは適合しません)。
2 番目の解決策は以下のとおりです。「pass_func」を に置き換えlambda:0
ます。