2017-10-27 3 views
0

このコードスニペットを理解できません。python継承とスーパーキーワード

class First(): 
    def __init__(self): 
    super(First, self).__init__() 
    print("first") 

class Second(): 
    def __init__(self): 
    super(Second, self).__init__() 
    print("second") 

class Third(Second, First): 
    def __init__(self): 
    super(Third, self).__init__() 
    print("third") 

Third(); 

、出力は次のとおりです。

first 
second 
third 

super(Third, self).__init__()この文が働いているどのようにSecond.__init__()
その後、基底クラスFirst.__init__()の逆の順序でそれぞれのコンストラクタが呼び出されるようです。

答えて

1

あなたは印刷する前に、あなたはそうはい、唯一super()戻っ後にprint()式が到達することになる、super()と呼ばれます。

あなたのクラスのメソッド解決順序(MRO)は、次のとおりです。

>>> Third.__mro__ 
(<class '__main__.Third'>, <class '__main__.Second'>, <class '__main__.First'>, <class 'object'>) 

はそうThird()を作成することは、その後に結果:

Third.__init__() 
    super(Third, self).__init__() 
     Second.__init__()     # next in the MRO for Third 
      super(Second, self).__init__() 
       First.__init__()   # next in the MRO for Third 
        super(First, self).__init__() 
         object.__init__() # next in the MRO for Third 
          return 
        print("first") 
        return 
      print("second") 
      return 
    print("third") 
    return 

ので、コード出力first、その後secondthirdが、方法がなかったです逆の順序で呼ばれる。

サイドノート:super() is a type of object、キーワードではありません。 super()はもう1つの式です(ただし、causes some side effects during compilation)。