今回の記事はオブジェクト指向についての記事、後編です。
前回の記事は以下です。以下の記事を読んでからこの記事を読むことをお勧めします。
この記事のゴール
オブジェクト指向の継承と拡張とオーバーライドをpythonプログラミングを通して理解する
クラスの継承 + 拡張
ここでもし、高性能なクラスがあるとします。
このクラスにさらに別の機能を付けたい時があると思います。
クラスは設計図で、インスタンスがその設計図から作られたロボットでした。
この時、クラスに空を飛ぶ機能を追加したいとしましょう。
そんなときに使うのが継承です。
もともとある高性能なクラスを継承して、空飛ぶロボットの設計図が作れるという訳です。
前回で名前を名乗るロボットを作成しました。以下のコードです。
class Robot:
# コンストラクタ▼
def __init__(self, name, battery):
self.name = name
self.battery = battery
# 名前を伝えるメソッド▼
def tellName(self):
print('ワタシノナマエハ' + self.name + 'デス')
my_robot = Robot('robot01', '100')
my_robot.tellName()
このクラスを継承して、空を飛べる機能を追加します。
これを拡張と言います。
拡張=メソッドの追加です。
以下のようになります。
######################################
## 元のクラス(親クラスにするクラス)
#####################################
class Robot:
# コンストラクタ▼
def __init__(self, name, battery):
self.name = name
self.battery = battery
# 名前を伝えるメソッド▼
def tellName(self):
print('ワタシノナマエハ' + self.name + 'デス')
######################################################
## 継承したクラス ★今回の章はここ以下に注目!👇
######################################################
class ICanFlyRobot(Robot):
def __init__(self, name, battery):
## 以下は親クラス(Robot)のコンストラクタを呼び出している
## そのためためselfはいらない
super().__init__(name, battery)
## 以下の部分でメソッドを追加し「拡張」している
def i_can_fly(self):
print('私は飛んでます')
## 本来はここに空を飛ぶ機能を書く
## インスタンス化
i_can_fly_robot = ICanFlyRobot('飛行ロボット01', '100')
## 既存の機能
## インスタンス化したときに指定した名前で名乗っているところに注目
i_can_fly_robot.tellName()
i_can_fly_robot.i_can_fly()
出力結果は以下。
ワタシノナマエハ飛行ロボット01デス
私は飛んでます
継承の書き方としては 「super()」を使う事で親クラスを指定することになる。
メソッドのオーバーライド
親クラスのメソッドの内部の処理を変えたい場合、親クラスのメソッドをオーバーライドすることができます。
つまり、上記のコード例でいうと、親クラスを継承したICanFlyRobotクラス内で親クラスにあるメソッドのtellNameの処理を変えるときにオーバーライドを使うって訳です。
今回は前章で継承して作成したICanFlyRobotクラスをさらに継承してICanFlyRobotクラス内のメソッドを変えてみようと思います。
元のRobotに空を飛ぶ機能を付けたICanFlyRobot、そのICanFlyRobotの空を飛ぶ機能ではなく低空飛行をする機能にしてみたいと思います。
つまり元のi_can_flyメソッドを上書き(オーバーライド)しています。
class Robot:
# コンストラクタ▼
def __init__(self, name, battery):
self.name = name
self.battery = battery
# 名前を伝えるメソッド▼
def tellName(self):
print('ワタシノナマエハ' + self.name + 'デス')
class ICanFlyRobot(Robot):
def __init__(self, name, battery):
super().__init__(name, battery)
def i_can_fly(self):
print('私は飛んでます')
############################################
## ここからオーバーライドをするクラスの記述👇
############################################
class ICanLowFlyRobot(ICanFlyRobot):
def __init__(self, name, battery):
super().__init__(name, battery)
def i_can_fly(self):
print('私は低空飛行しています')
i_can_low_fly_robot = ICanLowFlyRobot('低空飛行ロボット01', '100')
i_can_low_fly_robot.tellName()
i_can_low_fly_robot.i_can_fly()
出力結果は以下
ワタシノナマエハ低空飛行ロボット01デス
私は低空飛行しています
まとめ
今回はオブジェクト指向の継承と拡張とオーバーライドについて触れてきました。
ここまでくればある程度のオブジェクト指向pythonプログラムは読めるのではないでしょうか。
そして、今回はコードが短かったですが、オブジェクト指向プログラミングは大規模開発においてその真価を発揮します。
大規模開発に参加できればその恩恵を肌で感じることができるかもしれません。
最後までよんでいただきありがとうございました。
【参考】今すぐ試したい! 機械学習・深層学習(ディープラーニング) 画像認識プログラミングレシピ(以下Amazonリンク)