我需要找到一种优雅的方式来做 2 种 MixIn。
第一的:
class A(object):
def method1(self):
do_something()
现在,aMixInClass
应该method1
这样做:do_other()
-> A.method1()
-> do_smth_else()
- 即基本上“包装”旧函数。我很确定必须有一个很好的解决方案。
第二:
class B(object):
def method1(self):
do_something()
do_more()
在这种情况下,我希望MixInClass2
能够在do_something()
and之间注入自身do_more()
,即:do_something()
-> MixIn.method1
-> do_more()
。我知道这可能需要修改class B
- 没关系,只是寻找最简单的方法来实现这一点。
这些都是非常微不足道的问题,我实际上解决了它们,但我的解决方案被污染了。
第一个使用self._old_method1 = self.method1(); self.method1() = self._new_method1();
和编写_new_method1()
调用_old_method1()
.
问题:多个 MixIn 将全部重命名为 _old_method1 并且不优雅。
第二个 MixIn 是通过创建一个虚拟方法call_mixin(self): pass
并在调用和定义之间注入它来解决的self.call_mixin()
。再次不优雅并且会在多个 MixIns 上中断..
有任何想法吗?
感谢 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
仍在寻找第二个想法(这个想法不适合,因为我需要在旧方法内部注入,而不是在外部注入,就像在这种情况下一样)。
第二个解决方案如下,将“pass_func”替换为lambda:0
.