[Python]クラスの継承、メソッドのオーバーライド
Pythonのクラス継承やメソッドのオーバーライドについて紹介します。
最小のクラス定義はこちらをどうぞ。
クラスの継承
class Animal(): pass Class Dog(Car): pass
要は子クラスの()内に親クラスの名前を入れるだけでOK。
これで子クラスは親クラスを継承しました。
class Animal(): def cry(self): print('cry something') class Dog(): pass dog = Dog() dog.cry => cry something
子クラスでは何もメソッドを定義していないのに呼び出せていますね。これは親クラスのメソッドを継承しているからです。
子クラスは値も継承できるのか?
子クラスは親クラスのメソッドを継承できることはわかりました。では親クラスが持っている値も継承できるのでしょうか?
class Animal(): def __init__(self): self.name = 'someting animal' def cry(self): print('cry something') class Dog(Animal): pass dog = Dog() print(dog.name) => something animal
このように親クラスの持つ値も継承されています。
Pythonでは子クラスは親クラスから全てのものを継承します。
子クラスで新しいメソッドを追加する
子クラスは親クラスが持っていない新しいメソッドを追加することもできます。
class Animal(): def cry(self): print('cry something') class Dog(Animal): def bow(self): print('bow!') dog = Dog() dog.cry() dog.bow() => cry something bow!
子クラスのDogは親クラスのcryメソッドも改めて自身で設定したbowメソッドも使うことができます。
ちなみに親クラスからは子クラスで設定したメソッドを使うことはできません。
class Animal(): def cry(self): print('cry something') class Dog(Animal): def bow(self): print('bow!') animal = Animal() animal.bow => AttributeError: 'Animal' object has no attribute 'bow'
子クラスで親クラスのメソッドをオーバーライド(上書き)する
では、ここで疑問。親クラスと子クラスでメソッド名が重複してしまった場合はどうなるのでしょうか?
class Animal(): def cry(self): print('cry something') class Dog(Animal): def cry(self): print('bow!') dog = Dog() dog.cry() => bow!
答えは子クラスで定義したメソッドが上書きされる、でした。
これは親クラスのメソッドを子クラスがオーバーライド(上書き)しています。
親クラスのメソッドに何かしらの処理を付け足したい時などオーバーライドが活躍します。
クラスに継承がある意味
ここまでクラスの継承やオーバーライドなどを説明しましたが、そもそもなぜクラスにはこうした機能があるのでしょうか?
プログラムを書いていると、すでに書いたクラスで解決しそうなことはよくあります。
この時に改めて別でクラス定義をして中身をコピペで持ってきて少しいじっても良いでしょう。
しかし、それは綺麗なコードとは言えないし、メンテナンス的にも良いとは言えません。
かと言って元あるクラスを修正しても別のところでエラーが発生するかもしれません。
ベースとなるクラスを汚さずに、またメンテナンスをしやすくするためこうしたクラスの継承があります。
子クラスでは欲しい機能だけを追加したり上書きすればいいわけです。