2017-03-25 5 views
3

は、次のコードを考えてみましょう:Pythonの継承 - どのように祖父母メソッドを呼び出すには?

class A: 
    def foo(self): 
    return "A" 

class B(A): 
    def foo(self): 
    return "B" 

class C(B): 
    def foo(self): 
    tmp = ... # call A's foo and store the result to tmp 
    return "C"+tmp 
クラス Aで祖父母方法 fooが呼び出されるように、代わりに ...で書かれなければならない何

?私はsuper().foo()を試しましたが、クラスBの親メソッドfooを呼び出します。私はあなたが明示的に祖父母クラスからメソッドを呼び出すことができますPythonの3

+0

これはth番目ですこの質問の正確な同じケースは3日前に尋ねました:https://stackoverflow.com/questions/42937114/python-pattern-for-defaulting-to-a-grandparent-classs-implementation – coder

+0

これを行うことを望んでいることは明らかですあなたの遺産が間違っていることを知らせてください。私は強くコードを修正して、親をスキップする必要はないことを強くお勧めします。 –

答えて

3

どちらか他の人が示唆しているように明示的A.foo(自己)メソッドを使用することができます - あなたは無視して、クラスのメソッドを呼び出したいときにこれを使用AはBの親クラスであるか否かを:あなたは親クラスであるか否かにかかわらず、Bの親クラスの.fooという()メソッドを使用したい場合は、

class C(B): 
    def foo(self): 
    tmp = A.foo(self) # call A's foo and store the result to tmp 
    return "C"+tmp 

か、そして使用:

class C(B): 
    def foo(self): 
    tmp = super(B, self).foo() # call B's father's foo and store the result to tmp 
    return "C"+tmp 
1

を使用しています

class C(B): 
    def foo(self): 
     tmp = A.foo() 
     return "C" + tmp 
+0

コードのみの回答は良い答えとはみなされません – UnholySheep

+0

アドバイスをいただきありがとう@UnholySheep。更新された回答をご覧ください。 –

1

あなたは、単にクラスに関する明示することができます。 super()は、あなたが暗黙のうちに暗黙のうちにMethod Resolution Orderを自動的に解決することを許可しますが、特別なことは何もありません。

class C(B): 
    def foo(self): 
     tmp = A.foo(self) 
     return "C"+tmp 
+0

"Method Resolution Order"(MRO) – Tobias

+0

ありがとうTobias、fixed :) – Julien

関連する問題