第6章: クラスとオブジェクト指向

6-class-object-orientation

この章では、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メソッドは、nameageを使って挨拶のメッセージを生成します。

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クラスのコンストラクタがbrandmodelを初期化しています。

デストラクタは、オブジェクトが削除されるときに自動的に呼び出される特殊なメソッドです。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では明示的なアクセス修飾子(publicprivateなど)がない代わりに、名前の前にアンダースコアを使って可視性を暗黙的に示します。

  • パブリック(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におけるクラスとオブジェクト指向プログラミングの基本概念を学びました。クラスの定義、オブジェクトの生成、静的メンバーやプライベート属性の扱いを理解することで、オブジェクト指向設計を取り入れたプログラムを作成できるようになります。次の章では、オブジェクト指向プログラミングの応用として、継承やポリモーフィズムについて詳しく学んでいきます。

目次