2017-02-21 7 views
1

と仮定クラスA Bから継承され、Bが質問 方法のpython

class C(): 
    def my_method(self): 
     pass 

class B(C): 
    def my_method(self): 
     pass 

class A(B): 
    def my_method(self): 
     # Call my_method from B 
     super(A, self).my_method() 
     # How can I call my_method from C here ? 

C.

から継承され、オブジェクトの祖先にアクセスするには:どのように私はCからmy_methodを呼び出すことができますか?

+0

あなたは 'SomeClass'の親クラスを意味ですか? – Dschoni

+0

[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のように聞こえます。一般的には、特定の祖先にアクセスする必要はありません。アクセスするユーザーを「super」にしておくだけで、それは[MRO(メソッド解決の順序)]の全般的なポイントです(https://www.python.org/download /releases/2.3/mro/)。 – MSeifert

+0

'A()'によって作成されるオブジェクトは1つだけです。このオブジェクトはすべてのスーパークラスのインスタンスですが、親クラス用に作成された個別のオブジェクトはありません。 – kazemakase

答えて

1

あなたは、単に引数として渡さselfで、直接 『結合していない』メソッドを呼び出すことによりCmy_method()メソッドを呼び出すことができます。たとえば、次の((object)はPython 2.xの上で動作するようにsuper()ために必要な注意してください)以下を出力します

class C(object): 
    def my_method(self): 
     print('C.my_method') 

class B(C): 
    def my_method(self): 
     print('B.my_method') 

class A(B): 
    def my_method(self): 
     print('A.my_method') 
     super(A, self).my_method() # calls B.my_method(self) 
     C.my_method(self)   # calls C.my_method(self) 

a = A() 
a.my_method() 

実行し、:

A.my_method 
B.my_method 
C.my_method 

しかし、他の人が指摘したように、これは、あなたが望むものを達成するための最良の方法ではないかもしれません。文脈であなたが達成しようとしていることの具体例を挙げることができますか?すべての

+0

実際には、クラスAのmy_methodをオーバーライドしたい、つまり、クラスBではなく、クラスCのmy_methodにいくつかの機能を追加するつもりです。 –

0

あなたは、その__mro__属性を使用して、オブジェクトの完全な祖先にアクセスすることができます。

In [3]: KeyError.__mro__ 
Out[3]: (KeyError, LookupError, StandardError, Exception, BaseException, object) 
0

まずあなたがスーパー機能を使用したい場合は、あなただけのpythonの唯一の新しいスタイルのプログラミングでスーパー機能をサポートするので、この

class c(object): 
    pass 

のようなオブジェクトとして、基本クラスを使用する必要があります。

今、基本クラスの基本クラスの関数へのアクセス方法になります。あなたのケースでは、クラスCのmy_method関数をAから呼び出す方法

これは、静的で動的に2つの方法で実行できます。私は0番目のインデックスを取った理由

ここ

動的

class C(object): 
    def my_method(self): 
     print "in function c" 

class B(C): 
    def my_method(self): 
     print "in function b" 

class A(B): 
    def my_method(self): 
     # Call my_method from B 
     super(A, self).my_method() 
     # This is how you can call my_method from C here ? 
     super((self.__class__.__bases__)[0], self).my_method() 
obj_a = A() 
obj_a.my_method() 

self.__class__.__bases__)はタプル型のthatsにAの基底クラスを返します。したがって、クラスBを返すので、スーパークラスの引数としてBクラスを持つと、bクラスの基本クラスのmy_method関数が返されます。

静的

class C(object): 
    def my_method(self): 
     print "in function c" 

class B(C): 
    def my_method(self): 
     print "in function b" 

class A(B): 
    def my_method(self): 
     # Call my_method from B 
     super(A, self).my_method() 
     # This is how you can call my_method from C here ? 
obj_a = A() 
super(A,obj_a).my_method() # calls function of class B 
super(B,obj_a).my_method() # calls function of class A