<一覧に戻る

メソッドの呼び出し

オブジェクト指向プログラミング(OOP)を学ぶ上で、欠かせないのがメソッドの呼び出しです。 メソッドとは、クラスの中で定義される関数のことで、オブジェクトが持つ動作や機能を表現します。

例えば「犬が吠える」「本のタイトルを表示する」といった動作は、すべてメソッドによって表現されます。

今回は、Pythonにおけるメソッドの呼び出し方を、初心者でも理解できるように基礎から応用まで解説します。さらにインスタンスメソッド・クラスメソッド・静的メソッドの違いもわかりやすく紹介していきます。

メソッドとは?

Pythonにおけるメソッドは、クラスに属する関数のことです。 通常の関数と異なり、メソッドはそのクラスから生成されたオブジェクトに結びつき、オブジェクトが持つデータを操作したり、特定の動作を実行したりします。

例えば、犬を表すクラス Dog を作り、その中に「吠える」機能を持たせれば、Dog クラスから作ったオブジェクトごとに「ワン!」と鳴かせることができます。

メソッドの定義と呼び出し

Pythonでメソッドを定義するには、クラスの中で def キーワードを使います。

メソッドの最初の引数には必ず self を書きます。self は「そのメソッドを呼び出したオブジェクト自身」を指します。

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

    # メソッドの定義
    def bark(self):
        print(f"{self.name} says woof!")

    def get_age(self):
        return self.age

    def set_age(self, new_age):
        self.age = new_age

この Dog クラスでは、犬の名前と年齢を保存し、bark メソッドで吠える動作を表現しています。

メソッドを呼び出してみよう

クラスから生成されたオブジェクトを通じて、メソッドを呼び出します。 オブジェクト名に続けてドット (.) を使い、メソッド名を指定します。

必要に応じて引数を渡すこともできます。

# クラスの定義
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # メソッドの定義
    def bark(self):
        print(f"{self.name} says woof!")

    def get_age(self):
        return self.age

    def set_age(self, new_age):
        self.age = new_age

# Dogクラスのインスタンスを生成
my_dog = Dog("ポチ", 3)
your_dog = Dog("ハナ", 5)

# メソッドの呼び出し
my_dog.bark()    # 出力: ポチ says woof!
your_dog.bark()  # 出力: ハナ says woof!

print(my_dog.get_age()) # 出力: 3
print(your_dog.get_age()) # 出力: 5

# ageに6を設定するメソッド実行
my_dog.set_age(6)

print(my_dog.get_age()) # 出力: 6

ここで my_dog と your_dog は同じ Dog クラスから作られていますが、持っている名前や年齢は違います。 メソッドを呼び出すと、それぞれのオブジェクトに応じた結果が表示されるのがポイントです。

つまり、メソッドはオブジェクトごとに異なる動作をすることができるのです。

インスタンスメソッド・クラスメソッド・静的メソッドの違い

Pythonには大きく分けて3種類のメソッドがあります。それぞれについて解説します。

1.インスタンスメソッド

最もよく使われるのがインスタンスメソッドです。 self を引数に取り、オブジェクトのデータ(インスタンス変数)を操作します。

上記のコードの bark や set_age がインスタンスメソッドに当たります。

2.クラスメソッド

クラスメソッドは、クラス全体に関連した操作を行うためのメソッドです。

インスタンス固有のデータではなく、クラスレベルで共有されるデータや振る舞いを扱う場合に用いられます。 クラスメソッドは @classmethod デコレーターを使用して定義され、第一引数には cls を取ります。

class Counter:
    count = 0  # クラス変数

    @classmethod
    def increment(cls):
        cls.count += 1
        return cls.count

    @classmethod
    def reset(cls):
        cls.count = 0

# クラスメソッドだけで操作
print("初期値:", Counter.count)        # 0
print("増加:", Counter.increment())    # 1
print("増加:", Counter.increment())    # 2
Counter.reset()
print("リセット後:", Counter.count)   # 0

Counterクラスはクラス変数countを持ち、incrementメソッドはクラスメソッドとして定義されているため、インスタンスを作らなくても呼び出せます。 呼ぶたびにcountが1増え、その値を返します。また、resetメソッドもクラスメソッドで、countを0に戻す処理を行います。

このように、クラスメソッドを使うことで、クラス全体で共有する状態を操作でき、インスタンスに依存せずにクラス単位の処理を行うことができます。

3.静的メソッド(スタティックメソッド)

静的メソッド(スタティックメソッド)はクラスに結びついてはいますがself(インスタンス)やcls(クラス)を必要としないメソッドです。

クラスに関連はあるけれど、クラスやインスタンスのデータを必要としない処理をまとめたいときには静的メソッドを使います。 定義には @staticmethod を付けます。

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

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

# 静的メソッドの呼び出し
print(Math.add(5, 3))        # 出力: 8
print(Math.multiply(4, 7))   # 出力: 28

# インスタンスを通じても呼び出せます
math_instance = Math()
print(math_instance.add(10, 20))  # 出力: 30
print(math_instance.multiply(6, 9))  # 出力: 54

静的メソッドは、関数をクラスの中に整理したいときに便利です。 インスタンスを作らずに呼び出せるのも特徴です。

実践例:ユーティリティクラスの作成

ここでは、数学的な操作を提供する MathUtils クラスを作成し、クラスメソッドと静的メソッドの使い方を具体的に見てみましょう。

class MathUtils:
    @classmethod
    def square(cls, number):
        return number ** 2

    @staticmethod
    def cube(number):
        return number ** 3

# クラスメソッドの呼び出し
print(MathUtils.square(4))  # 出力: 16

# 静的メソッドの呼び出し
print(MathUtils.cube(3))    # 出力: 27

# インスタンスを通じても呼び出せます
math_instance = MathUtils()
print(math_instance.square(5))  # 出力: 25
print(math_instance.cube(2))    # 出力: 8

このように square で平方を求めたり、cube で立方を計算したりといった処理をまとめることで、再利用性の高いコードを書けるようになります。

まとめ

メソッドの呼び出しは、Pythonにおけるオブジェクト指向プログラミングの基礎中の基礎です。 今回学習した内容のまとめです。

  • インスタンスメソッドはオブジェクトごとの動作を担当します。
  • クラスメソッドはクラス全体に関する処理を行います。
  • 静的メソッドは汎用的な処理を整理するために使われます。

これらを正しく理解し、実際にコードを書いて試すことで、クラス設計の幅が広がります。 Pythonを学ぶ初心者の方も、まずは自分でクラスを作り、メソッドを呼び出してみるところから始めましょう。

出力結果: