2017-02-20 4 views
0

基本的には、私が持っている問題はhereであり、SonFather(この場合はinit)やGrandFatherdo_thing)のようなものをいくつか返すことがあります。自分以外のクラスの型を渡す、すなわち、その(上記の最後の行)のようなsuperを呼び出すに何らかの影響があるかどうか、私は疑問に思って何親の親の方法を呼び出すと、結果は何か?

class GrandFather(object): 
    def __init__(self): 
     pass 

    def do_thing(self): 
     # stuff 

class Father(GrandFather): 
    def __init__(self): 
     super(Father, self).__init__() 

    def do_thing(self): 
     # stuff different than Grandfather stuff 

class Son(Father): 
    def __init__(self): 
     super(Son, self).__init__() 

    def do_thing(self): 
     super(Father, self).do_thing() # <-- this line bypasses Father's implementation 

です。 私はあなたのコードがあなたがそれを期待していない奇妙な点で壊れているようなものを意味します。

+0

未対応のものについては、こちら(http://stackoverflow.com/questions/5033903/python-super-method-and-calling-alternatives)、[こちら](http://stackoverflow.com/questions)/222877/what-do-super-do-in-python)または[ここ](http://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods)? –

+1

@StephenRauch何がカバーされていませんか?私の質問はカバーされていません! :D私の例の最後の行が 'super(Son、self)'ではなく 'super(Father、self)'を読み込んでいることに注目してください。後者は 'super'を使う普通の方法です。これはあなたが提供したリンクでカバーされています。私の質問は、私は直接親クラスをバイパスし、祖父母クラスのメソッドを呼び出す前者についてです! – Mahdi

答えて

0

あなたが尋ねることは一般的にはうまくいくが、複数の継承がある場合には、あなたが意図していることとまったく同じではないかもしれない。

class GrandFather(object): 
    def do_thing(self): 
     print("Grandfather") 

class Father(GrandFather): 
    def do_thing(self): 
     print("Father") 

class Mother(GrandFather): 
    def do_thing(self): 
     print("Mother") 

class Son(Father, Mother): 
    def do_thing(self): 
     super(Father, self).do_thing() # will print "Mother", not "Grandfather" 

この問題ができたとしても作物:Sonも(近親相姦が原因でもGrandfatherのサブクラスであった)Motherクラスから継承している場合たとえば、あなたがあなたの最後の行から予想されるコールを取得していないと思います複数の継承がSonサブクラスに追加された場合(例えば、の前の定義がFatherから継承されているclass GrandSon(Son, Mother): pass)、予期せぬことに、

これは必要な場合とそうでない場合があります。常にGrandFatherの実装をdo_thingにしたい場合は、superを使用するのではなく、GrandFather.do_thing(self)を明示的に呼び出す必要があります。

しかし、親クラスのメソッドをバイパスすることは、一般的には良い考えではありません。おそらく、コードを再編成して、必要がないようにすることで、より効果的になるでしょう。おそらく、Sonを別の方法で使用できるようにするために、GrandFather.do_thingの部分を除外することができます。 Fatherでそのメソッドをオーバーライドする必要はありません。Father.do_thingから呼び出すことはできません。

関連する問題