Python super()関数使用及び多重継承


super()関数は、親クラスを継承する方法に使用できます。文法は以下の通りです。
super(type[,object-or-type])
super()関数の使用は比較的簡単であるが,関数の呼び出し関係を単一継承と多重継承に基づいて解析する必要がある。
まず、クラス間の継承関係が単一継承の場合、関数呼び出し関係も比較的簡単であり、以下の例を参照することができる。

#!/usr/bin/env python3

class A(object):
  def __init__(self):
    print('class A')

class B(A):
  def __init__(self):
    super(B, self).__init__()
    print('class B')

b = B()
上記コードの運行結果は以下の通りです。
クラスA
クラスB
その結果、サブクラスBは、実用化の際に親Aの___u u u_u u uを呼び出していることがわかる。init_()方法。
多重継承を行う場合はMROの問題を考慮する必要がある。MROとは、Method Resolution Orderであり、Pyton 2.3以来、MROは広さ優先(深さ優先と区別する)の規則で定義されている。この問題をよりよく理解するために、まず以下のコードを見てみましょう。

#!/usr/bin/env python3

class A(object):
  def __init__(self):
    self.n = 10
  
  def minus(self, m):
    print('minus in class A start')
    self.n -= m
    print('minus in class A end')

class B(A):
  def __init__(self):
    self.n = 7

  def minus(self, m):
    print('minus in class B start')
    super(B, self).minus(m)
    self.n -= 2
    print('minus in class B end')

class C(A):
  def __init__(self):
    self.n = 12

  def minus(self, m):
    print('minus in class C start')
    super(C, self).minus(m)
    self.n -= 5
    print('minus in class C end')

class D(B,C):
  def __init__(self):
    self.n = 15

  def minus(self, m):
    print('minus in class D start')
    super(D, self).minus(m)
    self.n -= 2
    print('minus in class D end')

print('The MRO of class D is :')
print(D.__mro__)

d = D()
d.minus(2)
print(d.n)
コード実行結果:
The MRO of class D is:
(〈class’___u(う)メーン.D',minus in class D start
minus in class B start
minus in class C start
minus in class A start
minus in class A end
minus in class C end
minus in class B end
minus in class D end
4
運転結果から、サブクラスDのMROはメーン.D',以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。