クラス②:コンストラクタとメソッドの応用【self・classmethod・staticmethod】

学び・スキルアップ

前回の記事で、クラスは設計図のようなものであり、
そこから「インスタンス(実体)」を作ることを学びました。

今回は、クラスをより便利に使うための
コンストラクタと3種類のメソッド を詳しく解説します。


🧩 コンストラクタ(__init__)とは?

コンストラクタは、インスタンスが作られるときに
自動的に呼び出されるメソッド です。

Pythonでは特別に __init__() という名前で定義します。


🔹 基本構文

class Car:
    def __init__(self, color, speed):
        self.color = color
        self.speed = speed

    def drive(self):
        print(f"{self.color}の車が {self.speed}km/h で走っています!")

🔹 インスタンス化

car1 = Car("赤", 60)
car2 = Car("青", 100)

car1.drive()
car2.drive()

出力:

赤の車が 60km/h で走っています!
青の車が 100km/h で走っています!

💡 __init__() に渡した引数が、インスタンス固有のデータとして保存されます。


🧠 self の正体をもう一度

クラス内のメソッドで最初に書く self は、
「今、操作しているインスタンス自身」を表します。

class Dog:
    def __init__(self, name):
        self.name = name

    def bark(self):
        print(f"{self.name}がワン!と吠えました。")
dog1 = Dog("ポチ")
dog2 = Dog("ハチ")

dog1.bark()
dog2.bark()

出力:

ポチがワン!と吠えました。
ハチがワン!と吠えました。

self があるから、インスタンスごとに独立したデータを持てるんです。


🧱 インスタンスメソッドとは?

今まで使ってきた self を含むメソッドは、
インスタンスメソッド」と呼ばれます。

  • self を使ってインスタンス固有のデータにアクセスする
  • 通常は オブジェクト.メソッド() の形で呼び出す

⚙️ クラス変数とインスタンス変数の違い

ここで、クラス全体で共有する変数を学びましょう。

class Car:
    wheels = 4  # クラス変数(全インスタンスで共通)

    def __init__(self, color):
        self.color = color  # インスタンス変数(個別)

car1 = Car("赤")
car2 = Car("青")

print(car1.wheels, car2.wheels)  # 両方4
car1.wheels = 6  # car1だけ上書き
print(car1.wheels, car2.wheels)

出力:

4 4
6 4

💡 wheels はクラス共通。color はインスタンスごとに違う。
クラス変数は全体の設定値、インスタンス変数は個人の状態です。


🧩 クラスメソッド(@classmethod)

クラス変数を操作したいときは、
クラスメソッド を使います。

class Car:
    wheels = 4

    def __init__(self, color):
        self.color = color

    @classmethod
    def change_wheels(cls, new_count):
        cls.wheels = new_count
        print(f"全ての車の車輪を {cls.wheels} 個に変更しました。")
Car.change_wheels(6)
print(Car.wheels)

出力:

全ての車の車輪を 6 個に変更しました。
6

💡 @classmethodcls を使ってクラス全体を操作します。
インスタンスを作らなくても呼び出せます。


⚙️ スタティックメソッド(@staticmethod)

@staticmethod は、クラスにもインスタンスにも依存しない
「ただの関数」 をクラスの中に整理したいときに使います。

class MathUtil:
    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def multiply(a, b):
        return a * b

呼び出し

print(MathUtil.add(3, 5))
print(MathUtil.multiply(4, 6))

出力:

8
24

💡 @staticmethodselfcls を使わないメソッド。
「関連する関数をまとめておきたいとき」に便利です。


🧠 3種類のメソッドまとめ

メソッドの種類定義使うとき特徴
インスタンスメソッドdef method(self)通常の処理各インスタンスのデータを操作
クラスメソッド@classmethod def method(cls)全体設定の変更クラス変数を操作できる
スタティックメソッド@staticmethod def method()便利関数selfclsも使わない

💡 応用:3種類を1つのクラスで使う

class Employee:
    company = "AI Works"

    def __init__(self, name):
        self.name = name

    def introduce(self):
        print(f"私は {Employee.company} の {self.name} です。")

    @classmethod
    def change_company(cls, new_name):
        cls.company = new_name
        print(f"会社名を {cls.company} に変更しました。")

    @staticmethod
    def hello():
        print("こんにちは!Pythonのクラスを学びましょう!")

実行例

Employee.hello()
Employee.change_company("OpenAI Japan")

emp1 = Employee("太郎")
emp1.introduce()

出力:

こんにちは!Pythonのクラスを学びましょう!
会社名を OpenAI Japan に変更しました。
私は OpenAI Japan の 太郎 です。

💡 クラスを使えば「設定」「個別データ」「便利関数」を
ひとつの構造に整理できます。


📝 この章のまとめ

  • __init__() はインスタンス作成時に自動実行される
  • self は「自分自身(インスタンス)」を表す
  • ✅ クラス変数は全体で共有される
  • @classmethod はクラス全体を操作する
  • @staticmethod は関連する関数をまとめるのに便利

次回 👉 クラス③:継承とポリモーフィズム
では、クラスを「引き継いで」新しい機能を追加したり、
「多態性」でメソッドを上書きする方法を学びます。

コメント