Pythonにおけるオブジェクト指向プログラミングの基礎

クラスとオブジェクトの概要

クラス(Class)は、共通の属性と動作を持つオブジェクトの設計図です。クラスから作られる個々の実体をインスタンスまたはオブジェクトと呼びます。

メソッドはクラス内に定義された関数で、そのクラスのインスタンスに対して操作を行います。
クラス変数はクラス全体で共有される変数で、すべてのインスタンス間で同じ値を持ちます。
インスタンス変数は各オブジェクトごとに異なる値を持つことができ、通常はselfを用いてアクセス・代入されます。

継承(Inheritance)により、既存のクラス(親クラス)の機能を新しいクラス(子クラス)が引き継ぐことができます。「is-a」関係を表現するのに適しています。
子クラスでは親クラスのメソッドを上書き(オーバーライド)することも可能です。

クラスの基本構文

class ClassName:
    # クラス本体
    pass

クラスのインスタンス化と属性参照

クラスをインスタンス化することでオブジェクトを作成し、その属性やメソッドを利用できます。

class Example:
    value = 100

    def display(self):
        return "Hello from method"

obj = Example()
print(obj.value)       # 100
print(obj.display())   # Hello from method

self の役割

クラス内のメソッドの第1引数は、そのメソッドを呼び出したインスタンス自身を表します。慣例としてselfと命名されますが、任意の名前でも構いません。

class Identity:
    def show(self):
        print(f"インスタンス: {self}")
        print(f"クラス: {self.__class__}")

inst = Identity()
inst.show()

コンストラクタ __init__

__init__はインスタンス生成時に自動的に呼び出される特殊メソッド(コンストラクタ)です。

class Point:
    def __init__(self, x, y):
        self.x_coord = x
        self.y_coord = y

p = Point(3, 4)
print(p.x_coord, p.y_coord)  # 3 4

メソッドの定義と利用

class Person:
    def __init__(self, name, age, weight):
        self.name = name
        self.age = age
        self.weight = weight

    def introduce(self):
        print(f"{self.name}は{self.age}歳で、体重は{self.weight}kgです。")

person = Person("Alice", 28, 55)
person.introduce()

単一継承とメソッドのオーバーライド

class Student(Person):
    def __init__(self, name, age, weight, grade):
        super().__init__(name, age, weight)
        self.grade = grade

    def introduce(self):
        print(f"{self.name}は{self.age}歳で、{self.grade}年生です。")

s = Student("Bob", 12, 45, 6)
s.introduce()

親クラスのメソッドを呼び出すにはsuper()を使用するのが推奨されます。

多重継承

Pythonでは複数のクラスを同時に継承できます。メソッド解決順序(MRO)は左から右に探索されます。

class Speaker:
    def __init__(self, name, topic):
        self.name = name
        self.topic = topic

    def speak(self):
        print(f"私は{self.name}。テーマは「{self.topic}」です。")

class Learner:
    def __init__(self, name, level):
        self.name = name
        self.level = level

    def speak(self):
        print(f"{self.name}はレベル{self.level}の学習者です。")

class Presenter(Speaker, Learner):
    def __init__(self, name, topic, level):
        Speaker.__init__(self, name, topic)
        Learner.__init__(self, name, level)

presenter = Presenter("Taro", "AI", 5)
presenter.speak()  # Speakerのspeakが呼ばれる(左優先)

プライベート属性とメソッド

属性やメソッド名の先頭に二重アンダースコア(__)を付けると、外部からの直接アクセスが制限されます(名前マングリングによる擬似プライベート)。

class SecretKeeper:
    def __init__(self):
        self.public = "公開情報"
        self.__private = "秘密情報"

    def reveal(self):
        return self.__private  # 内部からはアクセス可能

keeper = SecretKeeper()
print(keeper.public)      # OK
# print(keeper.__private) # エラー(直接アクセス不可)
print(keeper.reveal())    # 秘密情報

特殊メソッド(マジックメソッド)

クラスに特定の動作を定義するために使用される組み込みメソッドです。代表的なもの:

  • __init__: 初期化
  • __del__: オブジェクト破棄時の処理
  • __str__, __repr__: 文字列表現
  • __len__: len()対応
  • __add__, __sub__など: 演算子オーバーロード
  • __call__: インスタンスを関数のように呼び出し可能に

タグ: Python OOP クラス 継承 特殊メソッド

7月29日 21:27 投稿