<目次>
(1) Pythonの「super().__init__」とは?
(1-1) 構文
(1-2) サンプルプログラム
(1-3) 書き方の比較
(1) Pythonの「super().__init__」とは?
(1-1) 構文
Pythonのプログラムを見ていると、以下のような表現をしている部分に出くわした事はないでしょうか?本記事ではこの意味や使い方を紹介します。
class Taxi([親クラス]):
def __init__(self, XXX, XXX):
# 書き方#3
super().__init__([引数をKey-Valueで])
(1-2) サンプルプログラム
●super()を使用しない場合
⇒lengthやweightの初期化を複数回記述してしまっている(Taxi、Truckで2回)
class Car:
pass
class Truck(Car):
# コンストラクタ
def __init__(self, length, width, capacity_ton):
# 長さ、幅、容量
self.length = length
self.width = width
self.capacity_ton = capacity_ton
def getInfo(self):
return "【トラック】長さ:" + str(self.length) + " 幅:" + str(self.width) + " 容量(t):" + str(self.capacity_ton)
class Taxi(Car):
# コンストラクタ
def __init__(self, length, width, company):
# 長さ、幅、タクシー会社
self.length = length
self.width = width
self.company = company
def getInfo(self):
return "【タクシー】長さ:" + str(self.length) + " 幅:" + str(self.width) + " タクシー会社:" + self.company
def main():
truck = Truck(7200, 2000, 10)
taxi = Taxi(4000, 2000, "ABC交通")
print(truck.getInfo())
print(taxi.getInfo())
if __name__ == "__main__":
main()
(図131)

●super()を使用する場合
⇒結果は同じだが、lengthやweightの初期化は1回のみ記述(Car)
class Car:
# コンストラクタ
def __init__(self, length, width):
# 長さ、幅
self.length = length
self.width = width
class Truck(Car):
# コンストラクタ
def __init__(self, length, width, capacity_ton):
# 長さ、幅、容量
super().__init__(length, width)
self.capacity_ton = capacity_ton
def getInfo(self):
return "【トラック】長さ:" + str(self.length) + " 幅:" + str(self.width) + " 容量(t):" + str(self.capacity_ton)
class Taxi(Car):
# コンストラクタ
def __init__(self, length, width, company):
# 長さ、幅、タクシー会社
super(Taxi, self).__init__(length, width)
self.company = company
def getInfo(self):
return "【タクシー】長さ:" + str(self.length) + " 幅:" + str(self.width) + " タクシー会社:" + self.company
def main():
truck = Truck(7200, 2000, 10)
taxi = Taxi(4000, 2000, "ABC交通")
print(truck.getInfo())
print(taxi.getInfo())
if __name__ == "__main__":
main()
(図132)

(1-3) 書き方の比較
super()関数は「親クラスを継承」し、親クラスのメソッドへのアクセスを可能にします。
主な仕様・利点としては以下の通りです。
・super()の戻り値として、親クラスのオブジェクトを返却
・親クラスを明示的に参照しなくてよい
・子クラスに重複する処理を共通化できる
以下の3つの書き方は全て、実行時の挙動としては同じです。
(書き方#1)
class Taxi([親クラス]):
def __init__(self, XXX, XXX):
# 書き方#1
[親クラス].__init__(self, [引数をKey-Valueで])
(書き方#2)
class Taxi([親クラス]):
def __init__(self, XXX, XXX):
# 書き方#2
super([自クラス], self).__init__([引数をKey-Valueで])
(書き方#3)
class Taxi([親クラス]):
def __init__(self, XXX, XXX):
# 書き方#3
super().__init__([引数をKey-Valueで])
いずれの方法も目的は同じで、「親クラスの初期化処理を子クラスから呼び出すこと」です。