Python基礎:オブジェクト指向プログラミング(OOP)
継承の紹介
Lesson 3 of 7 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
継承はオブジェクト指向プログラミング(OOP)の核心的な概念の一つです。
あるクラス(子クラスまたはサブクラスと呼ばれる)が、別のクラス(親クラスまたはスーパークラスと呼ばれる)の属性やメソッドを引き継ぐことを可能にします。
つまり、共通の動作やデータを基本クラスに定義し、そこから機能を再利用・カスタマイズするより専門的なクラスを作成できるということです。これにより、同じコードを繰り返し書く必要がなくなります。
継承の基本構文
Pythonでは、親クラスの名前を子クラスの名前の後ろの括弧内に指定して継承を実現します。
class ParentClass:
# 親クラスの属性とメソッド
class ChildClass(ParentClass):
# 子クラスの属性とメソッド
子クラスが親クラスから継承すると、次のものを得ます:
- 親クラスのすべての属性(オブジェクトに結びついた変数)
- 親クラスのすべてのメソッド(オブジェクトに結びついた関数)
- 親クラスが持つ可能性のあるコンストラクタ(
__init__)
例:動物と鳴き声
継承をより身近に感じてもらうために動物を例にしましょう。
共通点を持つ一般的なAnimalクラスを作り、そこからそれを共有しつつ異なる鳴き声を持つ特定の動物(DogとCat)のクラスを作ります。
基本クラスはこちらです:
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def sound(self):
pass # 具体的な動物クラスで鳴き声を決定します
Animalクラスは:
__init__メソッドで、動物ごとのnameとageを設定します。sound()メソッドはまだ何もしません(passはプレースホルダーです)。 それぞれの動物の種類でその鳴き声に置き換えます。
では、2つの具体的な動物クラスを作りましょう:
class Dog(Animal):
def sound(self):
print("Woof woof!")
class Cat(Animal):
def sound(self):
print("Meow!")
ここで起こっていることは:
-
DogとCatは両方ともAnimalから継承しているので、 それぞれにnameとage属性を再度書かなくても自動的に持っています。 -
それぞれ独自の鳴き声を出すために
sound()メソッドをオーバーライド(上書き)しています。
オブジェクトの作成と利用
dog = Dog("Rex", 2)
cat = Cat("Mimi", 3)
print(dog.name) # Rex
dog.sound() # Woof woof!
print(cat.name) # Mimi
cat.sound() # Meow!
Dog("Rex", 2)を作るときに起こることは:
Dogは独自の__init__を持たないため、Pythonは親クラスAnimalの__init__を呼び出します。- その呼び出しで渡された
nameとageが新しいオブジェクトに保存されます。 dog.sound()と呼ぶと、まずDogクラス内のsound()を探して実行し、"Woof woof!"と表示します。
同じロジックがCatにも当てはまり、それぞれ固有のsound()メソッドを使います。
この例は継承の魔法を示しています:
- 共通の設定(
__init__)はAnimalクラスに一度だけ書きます。 - 各サブクラス(
Dog、Cat)は共有の特徴を保ちながら固有の振る舞いを追加します。 - その結果、コードの重複が減り、論理が整理され、関連するオブジェクトの管理が簡単になります。
3. 仕組み
- 共有構造:
Animalの__init__メソッドはDogやCatを作ると自動的に動きます。 - メソッドのオーバーライド:
DogとCatそれぞれが独自のsound()メソッドを持ち、Animalのプレースホルダーを置き換えます。Dogのsound()を呼ぶと、PythonはDogのメソッドを使い、Animalのものは使いません。
TIP: 子クラスがメソッドをオーバーライドしない場合は、自動的に親クラスのメソッドが使われます。
なぜ継承を使うのか?
継承を使うと:
- 共通のロジックを基本クラスにまとめて、コードの繰り返しを避けられます。
- コードをよりモジュール化し、読みやすくできます。
- 一般的な設計図から専門的なクラスを構築できます。
継承による考え方の例:
Animal→nameやage、sound()メソッドを持つ一般的な設計図。Dog→ 固有の鳴き声を持つ特定の動物タイプ。Cat→ 異なる鳴き声を持つ別の特定の動物タイプ。
まとめ
継承はオブジェクト指向プログラミングで、一般的な概念からより専門化したクラス階層を作るための強力なツールです。
Pythonでは、以下の方法で実装します:
- 共通の属性やメソッドを持つ親クラスを書く。
- 親クラスの名前を括弧内に書いた子クラスを作る。
- 必要に応じて子クラスでメソッドを追加・オーバーライドする。
次のレッスンでは、この概念を拡張して、子クラスが親クラスの振る舞いを呼び出し拡張する方法、super()について学びます。