我需要找到一种优雅的方式来做2种MixIns。在Python中执行MixIns的优雅方法有哪些?
第一:
class A(object):
def method1(self):
do_something()
现在,MixInClass
应该method1
做到这一点:do_other()
- >A.method1()
- >do_smth_else()
- 即基本上是 “包裹” 老功能。我很确定这一定有一个很好的解决方案。
二:
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();
并写入_new_method1()
来致电_old_method1()
。
问题:多个MixIns将全部重命名为_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
。
为了您的第二个问题,确实需要mixin.method1参数,如果是的话,做这些参数取决于变量/返回值在do_something()?最后,do_more()需要你的mixin的结果吗? – KillianDS 2010-05-03 11:35:57
不,do_more()不需要结果。参数?我可能只需要“自我”,无论如何都应该通过。 – 2010-05-03 13:29:20