web-dev-qa-db-ja.com

親によってオーバーライドされた親の親のメソッドを呼び出す

途中で別のクラスによってオーバーライドされた場合、継承チェーンで複数のクラスのメソッドをどのように呼び出しますか?

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):
        # how to be like Grandfather?
29
cosmo_kramer

GrandfatherFatherの直接のスーパークラスであるかどうかに関係なく、常にGrandfather#do_thingが必要な場合は、SonselfオブジェクトでGrandfather#do_thingを明示的に呼び出すことができます。

class Son(Father):
    # ... snip ...
    def do_thing(self):
        Grandfather.do_thing(self)

一方、Fatherであるかどうかに関係なく、Grandfatherのスーパークラスのdo_thingメソッドを呼び出す場合は、superを使用する必要があります(ティエリーの回答のように)。

class Son(Father):
    # ... snip ...
    def do_thing(self):
        super(Father, self).do_thing()
33
Sean Vieira

これは次の方法で実行できます。

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

    def do_thing(self):
        super(Father, self).do_thing()
20
Thierry J.