Python継承マスター:概念、構文、実践例
Python継承
継承により、親クラスの全機能を継承しつつ機能を追加・拡張する新しいクラスを作成できます。このチュートリアルでは明確な例とベストプラクティスでPython継承の使い方を説明します。
動画:Python継承
Pythonにおける継承
継承はコード再利用と論理的階層を促進するオブジェクト指向プログラミングの核心原則です。新しいクラス(派生または子クラス)は、既存クラス(基底または親クラス)への最小限またはゼロの変更で定義されます。子クラスは親の属性とメソッドを自動的に受け取り、必要に応じてオーバーライドや拡張が可能です。
Python継承の構文
class BaseClass:
# 基底クラスの本体
class DerivedClass(BaseClass):
# 派生クラスの本体
上記スニペットでは、DerivedClassがBaseClassのすべての公開メンバを継承します。新しいメソッド追加や既存メソッドオーバーライドにより、基底実装を再利用しつつ振る舞いをカスタマイズできます。
Python継承の例
実践例で継承を説明します。辺の数と長さを格納する汎用Polygonクラスがあるとします:
class Polygon:
def __init__(self, no_of_sides):
self.n = no_of_sides
self.sides = [0 for _ in range(no_of_sides)]
def input_sides(self):
self.sides = [float(input(f"Enter side {i+1} : ")) for i in range(self.n)]
def display_sides(self):
for i, side in enumerate(self.sides, 1):
print(f"Side {i} is {side}")
Polygonクラスは任意の多角形に共通の属性とメソッドをカプセル化します。Triangleはちょうど3辺の特定多角形なので、共有ロジックを再定義せずPolygonから継承できます:
class Triangle(Polygon):
def __init__(self):
super().__init__(3) # 基底を3辺で初期化
def find_area(self):
a, b, c = self.sides
s = (a + b + c) / 2
area = (s * (s - a) * (s - b) * (s - c)) ** 0.5
print(f"The area of the triangle is {area:.2f}")
以下の実行で継承が実際に動作することを確認:
>>> t = Triangle()
>>> t.input_sides()
Enter side 1 : 3
Enter side 2 : 5
Enter side 3 : 4
>>> t.display_sides()
Side 1 is 3.0
Side 2 is 5.0
Side 3 is 4.0
>>> t.find_area()
The area of the triangle is 6.00
Triangleがinput_sides()とdisplay_sides()を呼べることに注目—継承によりこれらメソッドが自動的に利用可能になります。
子クラスで属性やメソッドが見つからない場合、Pythonは親クラスを検索し、必要なら継承チェーンをさらに遡ります。
Pythonでのメソッドオーバーライド
PolygonとTriangleの両方が__init__メソッドを定義しています。子の実装は親をオーバーライドしますが、基底ロジックを明示的に呼び出して拡張すべきです。super()使用がモダンで推奨されるアプローチです:
class Triangle(Polygon):
def __init__(self):
super().__init__(3) # Polygon.__init__を呼び出し
オーバーライド時、子メソッドは新振る舞い追加や基底振る舞い修正を行いつつ、元の機能を保持できます。
Pythonは継承関係のイントロスペクション用にisinstance()とissubclass()を提供:
t = Triangle()
print(isinstance(t, Triangle)) # True
print(isinstance(t, Polygon)) # True
print(isinstance(t, int)) # False
print(isinstance(t, object)) # True
print(issubclass(Polygon, Triangle)) # False
print(issubclass(Triangle, Polygon)) # True
print(issubclass(bool, int)) # True
これらユーティリティは型チェックとオブジェクトが期待インターフェースに準拠することの確認に不可欠です。
super()詳細はPython super()関数ドキュメントを参照。
Python
- C#の継承:再利用可能で保守しやすいコードを構築する
- Python データ型マスター: 実践ガイド
- Python 演算子完全マスター: 包括的ガイド
- Python pass文完全マスター: 実践ガイド
- Python辞書完全ガイド:作成、操作、高度なテクニック
- Pythonカスタム例外マスター:実践ガイド
- Pythonオブジェクト指向プログラミング完全ガイド:クラス、継承、カプセル化、ポリモーフィズム
- Python演算子オーバーロード完全ガイド:__add__、__lt__など特殊メソッドでOOP設計を強化
- Python @propertyデコレータマスター:クリーンで後方互換なゲッター/セッター
- Python type()とisinstance()の理解:実例付き解説
- Pythonオブジェクト指向プログラミング完全ガイド:クラスと継承をマスター