2

我正在尝试运行具有如下继承模式的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 是 mixin,所以它们不应该独立产生。我该如何解决这个问题,以便 F 类可以调用特定的 mixin?

4

2 回答 2

2

如果您提前知道它们的名称,则可以调用它们的方法并C显式传递:Dself

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, ...)
于 2012-08-11T05:53:19.780 回答
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()
于 2012-08-11T06:10:21.363 回答