この章では、Pythonのクラスとオブジェクト指向プログラミング (OOP: Object-Oriented Programming) について学びます。OOPは、データとその処理を一つの単位(オブジェクト)としてまとめる方法であり、大規模なソフトウェアを効率的に設計するための強力な手法です。この章では、クラスの定義やオブジェクトの生成、コンストラクタとデストラクタ、アクセス修飾子など、PythonにおけるOOPの基本概念について詳しく解説します。
6.1 クラスの定義とインスタンス化
クラスはオブジェクトの設計図のようなもので、データ(属性)とその操作(メソッド)をまとめたものです。クラスを使ってオブジェクトを作成し、オブジェクトに対して操作を行うことで、プログラムを整理された形で構築できます。
クラスの基本構文
class クラス名:
def __init__(self, 引数):
# コンストラクタで属性を初期化
self.属性名 = 引数
def メソッド名(self):
# メソッドの処理
pass
例:クラスの定義とオブジェクトの生成
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
return f"Hello, my name is {self.name} and I am {self.age} years old."
# クラスからオブジェクトを生成(インスタンス化)
person1 = Person("Alice", 30)
print(person1.greet()) # "Hello, my name is Alice and I am 30 years old."
この例では、Person
クラスを定義し、__init__
メソッドを使ってオブジェクトの属性を初期化しています。greet
メソッドは、name
とage
を使って挨拶のメッセージを生成します。
6.2 コンストラクタとデストラクタの役割
コンストラクタは、クラスからオブジェクトが生成されるときに自動的に呼び出される特殊なメソッドで、通常はオブジェクトの初期化を行います。Pythonでは、コンストラクタは__init__
という名前で定義します。
コンストラクタの例
class Car:
def __init__(self, brand, model):
self.brand = brand
self.model = model
def show_info(self):
return f"Car: {self.brand} {self.model}"
car1 = Car("Toyota", "Corolla")
print(car1.show_info()) # "Car: Toyota Corolla"
この例では、Car
クラスのコンストラクタがbrand
とmodel
を初期化しています。
デストラクタは、オブジェクトが削除されるときに自動的に呼び出される特殊なメソッドです。Pythonでは__del__
メソッドとして定義されますが、Pythonのガベージコレクタが自動的にメモリを管理するため、デストラクタを使う機会は少ないです。
デストラクタの例
class Person:
def __init__(self, name):
self.name = name
print(f"{self.name} is created.")
def __del__(self):
print(f"{self.name} is deleted.")
person = Person("John")
del person # 明示的にオブジェクトを削除する
この例では、オブジェクトが削除されるとデストラクタが呼ばれ、”John is deleted.” と表示されます。
6.3 フィールド、プロパティ、メソッドのアクセス修飾子
Pythonでは、クラスの属性やメソッドにアクセス修飾子を適用して、アクセスレベル(外部からの可視性)を制御できます。Pythonでは明示的なアクセス修飾子(public
、private
など)がない代わりに、名前の前にアンダースコアを使って可視性を暗黙的に示します。
- パブリック(public): クラス外からアクセス可能。名前にアンダースコアを付けない。
- プライベート(private): クラス内からのみアクセス可能。名前の前に
__
を付ける。
例:パブリック属性とプライベート属性
class Employee:
def __init__(self, name, salary):
self.name = name # パブリック属性
self.__salary = salary # プライベート属性
def get_salary(self):
return self.__salary
def set_salary(self, new_salary):
if new_salary > 0:
self.__salary = new_salary
else:
print("Invalid salary!")
emp = Employee("Alice", 50000)
print(emp.name) # パブリック属性はアクセス可能
print(emp.get_salary()) # プライベート属性はメソッドを介してアクセス
この例では、name
はパブリック属性であり、外部から直接アクセスできますが、__salary
はプライベート属性であり、クラス内のメソッドを通じてのみアクセス可能です。
6.4 静的メンバー (static) の使い方
静的メンバーは、クラスに属する属性やメソッドで、クラス全体で共有され、個々のオブジェクトに依存しません。静的メソッドは@staticmethod
デコレータを使って定義し、インスタンスの属性にアクセスせず、クラス全体の操作に使用されます。
静的メンバーの例
class MathOperations:
PI = 3.14159 # 静的属性
@staticmethod
def add(a, b):
return a + b
print(MathOperations.PI) # 静的属性にアクセス
print(MathOperations.add(5, 3)) # 静的メソッドを呼び出し
この例では、PI
は静的属性であり、インスタンス化せずにクラスから直接アクセスできます。また、add
メソッドは静的メソッドで、インスタンスに依存しない計算を行っています。
6.5 オブジェクト初期化子と匿名型
Pythonには匿名型はありませんが、辞書やタプルを使って、名前を持たないデータのセットを簡単に扱うことができます。特定の型を定義せずにデータを扱いたい場合には、これらのデータ構造が便利です。
辞書を使った匿名データの扱い
person = {
"name": "Alice",
"age": 30,
"city": "New York"
}
print(person["name"]) # Alice
print(person["age"]) # 30
辞書を使うことで、簡単に名前付きデータを扱うことができます。
まとめ
この章では、Pythonにおけるクラスとオブジェクト指向プログラミングの基本概念を学びました。クラスの定義、オブジェクトの生成、静的メンバーやプライベート属性の扱いを理解することで、オブジェクト指向設計を取り入れたプログラムを作成できるようになります。次の章では、オブジェクト指向プログラミングの応用として、継承やポリモーフィズムについて詳しく学んでいきます。