17

考慮事項:

class Parent(object):

    def altered(self):
        print "PARENT altered()"

class Child(Parent):

    def altered(self):
        print "CHILD, BEFORE PARENT altered()"
        super(Child, self).altered()    # what are the arguments needed?  Why Child and self?
        print "CHILD, AFTER PARENT altered()"

Python 2.7 ではChild、引数としてsuper()呼び出しに渡す必要があるのはなぜですか? スーパーを機能させるだけでなく、スーパーを使用することの正確な複雑さは何ですか.

4

2 に答える 2

25

superメソッド解決順序の次のクラスを特定します。あなたが渡す 2 つの引数は、それを理解させるものです -self属性を介して MRO 全体を与えます。現在のクラスは、MROの現在の位置を示します。したがって、スーパーが実際に行っていることは基本的に次のとおりです。

def super(cls, inst):
    mro = inst.__class__.mro() # Always the most derived class
    return mro[mro.index(cls) + 1]

それが基本クラスではなく現在のクラスである理由は、スーパーを持つことの全体的なポイントは、明示的に参照する必要があるのではなく、その基本クラスが何であるかを解決する関数を持つことであるためです。これは、基本クラスが親クラスの名前が正確にわからない場合 (namedtuple新しいクラスを吐き出すようなファクトリ関数を考えてください)、特に多重継承の状況 (MRO の次のクラスが存在しない可能性がある場合) では、名前が変更されます。現在のクラスのベースの 1 つ)。

于 2013-04-09T08:09:09.577 に答える