今回は、Pythonでclassを継承する方法についてご紹介します。
classを継承とは
Pythonのclass継承は、既存のクラス(親クラスや基底クラス)を引き継ぎ、新たなクラス(子クラスや派生クラス)で機能を拡張する仕組みです。
オブジェクト指向のプログラミングでは、共通する処理や属性を親クラスにまとめ、子クラスで追加の機能や変更が必要な部分のみ上書き(メソッドのオーバーライド)します。
これによりコードの重複を減らし、保守や拡張を容易にするメリットがあります。
classを継承する方法
Pythonのクラス定義では、クラス名の後に丸括弧を付けて、その中に親クラス名を指定することで継承を実現します。
具体的には、class 子クラス(親クラス): のように宣言します。
さらに、親クラスの初期化やメソッドを呼び出すにはsuper()を利用します。
Python 3系では、super()に引数をつけずに呼び出す方法が一般的です。
多重継承も可能ですが、同名メソッドを複数の親クラスから受け継いだ場合、どちらが呼ばれるかはMRO(Method Resolution Order)で決まります。
基本的な使い方の例
ここでは、動物(Animalクラス)を親クラス、犬(Dogクラス)を子クラスとして例を示します。
クラス定義と継承を明示的に確認できるよう、以下のコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Animal: def __init__(self, name): self.name = name def speak(self): print(f"{self.name}は何か音を出す。") class Dog(Animal): def __init__(self, name, breed): super().__init__(name) self.breed = breed def speak(self): print(f"{self.name}はワンワンと吠える。") if __name__ == "__main__": animal = Animal("動物") animal.speak() dog = Dog("ポチ", "柴犬") dog.speak() print(f"名前: {dog.name}, 犬種: {dog.breed}") |
このコードを実行すると、以下のように表示されます。
動物は何か音を出す。
ポチはワンワンと吠える。
名前: ポチ, 犬種: 柴犬
上記のように、継承によってAnimalクラスが持つname属性を共有しつつ、Dogクラスでは新たにbreed属性を追加しています。
また、speakメソッドをオーバーライドして、犬らしい動作に変更しています。
よくあるエラー
クラス継承を使用する際に起こりやすいエラーや注意点をいくつか紹介します。
- NameError: super()の呼び出しを忘れた、もしくは綴りを間違えた場合などに発生します。
- TypeError: __init__メソッドに渡す引数が合わないときに起こります。親クラス、子クラスそれぞれで必要な引数を整理しましょう。
- AttributeError: 親クラスに存在しない属性やメソッドを呼ぼうとしたときに発生します。クラス間のメソッド・属性の定義を確認してください。
- MROの衝突: 多重継承を使い、同名メソッドを複数の親クラスが定義している場合、メソッド解決順序によっては意図しない動作を引き起こす可能性があります。
まとめ
Pythonにおけるclass継承は、コードの再利用や拡張性を高める重要な仕組みです。
super()を用いて親クラスのメソッドやコンストラクタを呼び出し、必要に応じてメソッドをオーバーライドすることで柔軟な実装が可能になります。
正しい設計を行いながら、保守しやすいクラス構造を目指すことが大切です。