我正在尝试运行具有这样的继承模式的python代码:
A Object
| /\
| B C
| | |
| D E
\ | /
\|/
F
A = Base Handler
B = OAuth2 Mixin
C = OAuth Mixin
D = Facebook Graph Mixin
E = Twitter Mixin
B,C,D,E中的函数名称重叠。 D和E是mixins,所以它们不应该独立产生。我如何解决这个问题,所以F类可以调用特定的mixins?
答案 0 :(得分:2)
如果您提前知道C
和D
的名称,则可以调用他们的方法并明确传递self
:
class E(C, D):
def do_c_thing(self):
# Call C's version
C.some_method(self, ...)
def do_d_thing(self):
# Call D's version
D.some_method(self, ...)
答案 1 :(得分:1)
重新考虑继承两者是否真正你想做什么。如果你只从A和C继承,只保留一个D的实例,如下:
class E(A, C):
def __init__(self):
self.d = D()
,然后self.foo()
将mro上升到B.foo
。要致电D.foo
,您需要self.d.foo()
。您还需要在D
中明确地包装您想要的E
的任何其他方法 - 如果您使用的是Python 3,那么就像以下一样简单:
def __init__(self):
self.d = D()
self.bar = d.bar
在Python 2中,这不起作用,最简单的方法是编写包装器,如下所示:
def bar(self):
return self.d.bar()