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との名前が事前にわかっている場合は、それらのメソッドを呼び出して明示的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, ...)
于 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 に答える