Python多重继承问题

时间:2012-08-11 05:41:32

标签: python multiple-inheritance tornado mixins

我正在尝试运行具有这样的继承模式的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?

2 个答案:

答案 0 :(得分:2)

如果您提前知道CD的名称,则可以调用他们的方法并明确传递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()