継承、多重継承

Pythonにおける**オブジェクト指向プログラミング(OOP)**の重要な概念のひとつに、「継承」があります。さらに、Pythonでは「多重継承」もサポートされています。以下に、それぞれについて詳しく説明します。


継承(Inheritance)

継承とは、あるクラス(親クラス、基底クラス)の機能(属性やメソッド)を、別のクラス(子クラス、派生クラス)が引き継ぐ仕組みです。これにより、コードの再利用性が高まり、拡張性のある設計が可能になります。

基本構文

python
class 親クラス: # 属性やメソッドの定義 class 子クラス(親クラス): # 親クラスの機能を引き継ぎつつ、独自の定義も可能

python
class Animal: def speak(self): print("Some sound") class Dog(Animal): def speak(self): print("Bark") a = Animal() a.speak() # 出力: Some sound d = Dog() d.speak() # 出力: Bark(オーバーライドされた)

ポイント

  • 子クラスは親クラスの属性・メソッドを自動的に利用できます。

  • 子クラス内で親クラスのメソッドを**オーバーライド(上書き)**することもできます。

  • super() 関数を使うと、親クラスのメソッドを子クラスから呼び出すことができます。


多重継承(Multiple Inheritance)

多重継承とは、ひとつのクラスが複数の親クラスから同時に継承することを意味します。Pythonは多重継承を直接サポートしており、非常に柔軟なクラス設計が可能です。

基本構文

python
class 親クラスA: pass class 親クラスB: pass class 子クラス(親クラスA, 親クラスB): pass

python
class Flyer: def fly(self): print("I can fly") class Walker: def walk(self): print("I can walk") class Bird(Flyer, Walker): pass b = Bird() b.fly() # 出力: I can fly b.walk() # 出力: I can walk

ポイント

  • 子クラスはすべての親クラスの機能を継承します。

  • 名前の重複があると、**メソッド解決順序(MRO: Method Resolution Order)**に従ってどのメソッドを使うかが決まります。

  • super() 関数も、MROに基づいて動作します。


メソッド解決順序(MRO)

Pythonでは、C3線形化というアルゴリズムを用いて、クラスのメソッドや属性をどの順番で探索するかが決定されます。確認には クラス名.__mro__ または help(クラス名) を使います。

python
class A: pass class B(A): pass class C(A): pass class D(B, C): pass print(D.__mro__) # 出力: (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

まとめ

概念 説明
継承 親クラスの機能を子クラスが受け継ぐ仕組み。再利用や拡張に有効。
多重継承 子クラスが複数の親クラスから機能を継承できる柔軟な構文。
MRO メソッドや属性の探索順序を決定するルール。super()にも関係。

生成日:2025/05/03