Pythonオブジェクト指向プログラミング完全ガイド:クラス、継承、カプセル化、ポリモーフィズム
Pythonオブジェクト指向プログラミング
このガイドでは、Pythonのオブジェクト指向プログラミング(OOP)の核心概念を、堅牢で再利用可能なコード構築を示す実践例とともに解説します。
動画:Pythonでのオブジェクト指向プログラミング
オブジェクト指向プログラミング
Pythonは複数のプログラミングスタイルをサポートするマルチパラダイム言語です。最も強力なアプローチの一つは、オブジェクトを使って問題をモデリングすること—いわゆるオブジェクト指向プログラミング(OOP)です。
オブジェクトは2つの本質的特性を持ちます:
- 属性(データ)
- 振る舞い(メソッド)
例えばオウムは、name、age、colorといった属性と、sing()、dance()といった振る舞いを持つオブジェクトです。
PythonのOOPはDRY(Don't Repeat Yourself)原則に従い、再利用可能なコードを促進します。
クラス
classはオブジェクトの構造と振る舞いを定義する設計図です。オウムの詳細なスケッチのようなもの:オウムが持つプロパティとアクションを指定します。
class Parrot:
pass
ここではParrotは空のクラスです。このクラスのインスタンスは後で作成されます。
オブジェクト
オブジェクト(インスタンス)はクラスの具体的な実現です。クラス定義時にはメモリは割り当てられず、テンプレートのみ存在します。クラスをインスタンス化するとオブジェクトが作成されます。
obj = Parrot()
以下の例では、機能的なParrotクラスを構築し、bluとwooという2つのインスタンスを作成します:
class Parrot:
# クラス属性
species = "bird"
# インスタンス属性
def __init__(self, name, age):
self.name = name
self.age = age
# クラスをインスタンス化
blu = Parrot("Blu", 10)
woo = Parrot("Woo", 15)
# クラス属性にアクセス
print("Blu is a {}".format(blu.__class__.species))
print("Woo is also a {}".format(woo.__class__.species))
# インスタンス属性にアクセス
print("{} is {} years old".format(blu.name, blu.age))
print("{} is {} years old".format(woo.name, woo.age))
出力
Blu is a bird Woo is also a bird Blu is 10 years old Woo is 15 years old
このスニペットでは、speciesはすべてのオウムで共有されるクラス属性、一方nameとageは各オブジェクト固有のインスタンス属性です。
メソッド
メソッドはクラス内で定義される関数で、オブジェクトの振る舞いを記述します。クラスのインスタンス上で呼び出されます。
class Parrot:
def __init__(self, name, age):
self.name = name
self.age = age
def sing(self, song):
return f"{self.name} sings {song}"
def dance(self):
return f"{self.name} is now dancing"
# インスタンス化してメソッド使用
blu = Parrot("Blu", 10)
print(blu.sing("'Happy'"))
print(blu.dance())
出力
Blu sings 'Happy' Blu is now dancing
継承
継承により、新しいクラスが既存クラスの属性とメソッドを継承でき、コード再利用と論理的階層を促進します。
# 基底クラス
class Bird:
def __init__(self):
print("Bird is ready")
def whoisThis(self):
print("Bird")
def swim(self):
print("Swim faster")
# 派生クラス
class Penguin(Bird):
def __init__(self):
super().__init__()
print("Penguin is ready")
def whoisThis(self):
print("Penguin")
def run(self):
print("Run faster")
peggy = Penguin()
peggy.whoisThis()
peggy.swim()
peggy.run()
出力
Bird is ready Penguin is ready Penguin Swim faster Run faster
カプセル化
カプセル化はオブジェクトの内部状態への直接アクセスを制限し、データ整合性を保護します。Pythonでは、プライベート属性を先頭アンダースコア(シングルまたはダブル)で表記します。
class Computer:
def __init__(self):
self.__maxprice = 900
def sell(self):
print(f"Selling Price: {self.__maxprice}")
def setMaxPrice(self, price):
self.__maxprice = price
c = Computer()
c.sell()
# 直接変更を試みる
c.__maxprice = 1000
c.sell()
# セッターメソッド使用
c.setMaxPrice(1000)
c.sell()
出力
Selling Price: 900 Selling Price: 900 Selling Price: 1000
ポリモーフィズム
ポリモーフィズムにより、異なるクラスのオブジェクトを共通インターフェースで扱え、多様なオブジェクトタイプで動作する柔軟なコードが書けます。
class Parrot:
def fly(self):
print("Parrot can fly")
def swim(self):
print("Parrot can't swim")
class Penguin:
def fly(self):
print("Penguin can't fly")
def swim(self):
print("Penguin can swim")
# 共通インターフェース
def flying_test(bird):
bird.fly()
blu = Parrot()
peggy = Penguin()
flying_test(blu)
flying_test(peggy)
出力
Parrot can fly Penguin can't fly
重要なポイント
- OOPはコードを明確性と保守性のために構造化します。
- クラスは継承を通じてコード再利用を可能にします。
- カプセル化は内部データを保護します。
- ポリモーフィズムはオブジェクトタイプ間で柔軟なインターフェースを提供します。
Python
- Raspberry PiとOpenCVによる自動ビジョンベース物体追跡
- C# クラスとオブジェクト:堅牢な OOP の基礎
- Python データ型マスター: 実践ガイド
- Python 演算子完全マスター: 包括的ガイド
- Python辞書完全ガイド:作成、操作、高度なテクニック
- Pythonカスタム例外マスター:実践ガイド
- Python継承マスター:概念、構文、実践例
- Pythonオブジェクト指向プログラミング完全ガイド:クラスと継承をマスター
- Javaシングルトンパターン完全解説:安全な実装と活用法
- Javaオブジェクトとクラス:コアOOP概念を完全理解
- Javaオブジェクト直列化: オブジェクトの持続化と復元(Serializable/transient/ObjectOutputStream)