-1

検討:

class X:

    def some_method(self):
        print("X.some_method called")

class Y:

    def some_method(self):
        print("Y.some_method called")

class Foo(X,Y):

    def some_method(self):

        super().some_method()
        # plus some Foo-specific work to be done here

foo_instance = Foo()
foo_instance.some_method()

出力:

X.some_method called

Foo のクラス宣言を次のように切り替えます。

class Foo(Y,X):

出力を次のように変更します。

Y.some_method called

両方の祖先メソッドを呼び出したい場合は、Foo の実装を次のように変更できます。

def some_method(self):

    X().some_method()
    Y().some_method()
    # plus some Foo-specific work to be done here

これは私の質問につながります。コードのように明示的に実行せずに、Python にすべての祖先でメソッドを呼び出させる超秘密の方法はありますか (ここで all_ancestors キーワードを作成しています-そのようなことは実際に存在しますか?):

def some_method(self):

    all_ancestors().some_method()
    # plus some Foo-specific work to be done here

予想される出力は次のとおりです。

X.some_method called
Y.some_method called
4

2 に答える 2

2

いいえ、秘密の方法はありません。他の質問で述べたように、これを行う通常の方法は、単一の子孫クラスからすべての祖先メソッドを呼び出すことではありません。代わりに、各クラスは1 つの祖先メソッド、つまり継承チェーンの次のメソッドsuperを呼び出すために使用する必要があります。ツリー内のすべてのクラスがこれを行う場合 (最上位の基本クラスを除く)、すべてのメソッドが順番に呼び出されます。つまり、Foo は を使用する必要があり、これはのメソッドを呼び出します。のメソッドを呼び出すも使用する必要があります。super()XXsuper()Y

これを正しく機能させるには、通常、継承ツリーの最上位クラスを 1 つにするのが最善です。あなたの例では、これは X と Y の両方のベースとなるクラスになりsuperます。呼び出しシーケンスの最終停止として機能するには、そのようなクラスが必要です。この基本クラスは、 super を呼び出すべきではありません。どこでも呼び出し続けるとsuper、最終的には基本objectクラスobjectを呼び出そうとしますが、呼び出しようとしているメソッドが提供されないため失敗します。

于 2012-09-05T02:30:22.510 に答える
0

X&Yに共通の基本クラスまたはミックスインを提供できる場合、これは機能するはずです。

class ISomeMethod:
    def some_method(self):
        pass

class X(ISomeMethod):
    def some_method(self):
        print("X.some_method called")
        super(X, self).some_method()

class Y(ISomeMethod):
    def some_method(self):
        print("Y.some_method called")
        super(Y, self).some_method()

some_method次に、 で基本クラスを宣言した順序で呼び出す必要がありますFoo

于 2012-09-05T04:27:46.053 に答える