61

3 レベルのクラス継承を持つコードを使用しています。最下位レベルの派生クラスから、階層の 2 レベル上のメソッド (例: super.super 呼び出し) を呼び出す構文は何ですか? 「中間」クラスは、呼び出す必要があるメソッドを実装していません。

4

5 に答える 5

78

さて、これはそれを行う1つの方法です:

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def my_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Hello Grandparent"
        Grandparent.my_method(self)

あなたが望むものではないかもしれませんが、私が間違っていない限り、それはpythonが持っている最高のものです。あなたが求めていることは反pythonicに聞こえます.なぜあなたがそれをしているのかを説明しなければなりません.

別の例、おそらくあなたが望むもの(あなたのコメントから):

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def some_other_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Hello Grandparent"
        super(Child, self).my_method()

ご覧のとおり、は実装されていParentませんが、まだ super を使用して「見る」メソッド、つまりのを取得できます。my_methodChildParentGrandparentmy_method

于 2015-07-05T15:59:45.320 に答える
5

レベルを 2 つ上げたい場合は、

class GrandParent(object):                                                       

    def act(self):                                                               
        print 'grandpa act'                                                      

class Parent(GrandParent):                                                       

    def act(self):                                                               
        print 'parent act'                                                       

class Child(Parent):                                                             

    def act(self):                                                               
        super(Child.__bases__[0], self).act()                                    
        print 'child act'                                                        


instance = Child()                                                               
instance.act()

# Prints out
# >>> grandpa act
# >>> child act      

空かどうかをチェック__bases__したり、中流階級に複数の継承がある場合はループしたりするなど、防御的なものを追加できます。スーパーのタイプが親タイプではないため、スーパーのネストは機能しません。

于 2016-01-29T17:40:59.677 に答える