<一覧に戻る

メソッドの呼び出し

オブジェクト指向プログラミング(OOP)において、メソッドの呼び出しは、オブジェクトが持つ動作や機能を実行するための基本的な操作です。このセクションでは、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クラスのインスタンスを生成
my_dog = Dog("Buddy", 3)
your_dog = Dog("Lucy", 5)

# インスタンス属性にアクセス
print(my_dog.name)  # 出力: Buddy
print(your_dog.age)  # 出力: 5

# クラス属性にアクセス
print(Dog.species)      # 出力: Canis familiaris
print(my_dog.species)   # 出力: Canis familiaris

# メソッドの呼び出し
print(my_dog.bark())    # 出力: Buddy says woof!
print(your_dog.bark())  # 出力: Lucy says woof!

説明

  • オブジェクト生成:

    • my_dogyour_dog は、Dog クラスから生成された2つの異なるオブジェクトです。
    • __init__ メソッドが自動的に呼び出され、nameage が初期化されます。
  • メソッドの呼び出し:

    • my_dog.bark()your_dog.bark() は、各オブジェクトの bark メソッドを呼び出しています。
    • メソッド呼び出しにより、各オブジェクトの状態に基づいた動作が実行されます。

インスタンスメソッドとクラスメソッド

インスタンスメソッド

インスタンスメソッドは、特定のオブジェクトに関連付けられたメソッドで、オブジェクトの状態(インスタンス変数)を操作するために使用されます。上記の bark, get_age, set_age はすべてインスタンスメソッドです。

クラスメソッド

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

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

    def __init__(self, name):
        self.name = name
        Person.count += 1

    @classmethod
    def total_count(cls):
        return cls.count

p1 = Person("Alice")
p2 = Person("Bob")

print(Person.total_count())  # 2

説明

ここではtotal_countがクラスメソッドとして定義されています。これにより cls.count にアクセスして、現在までに生成されたPersonインスタンスの数を取得できます。

静的メソッド

静的メソッドはクラスに結びついてはいますがself(インスタンス)やcls(クラス)を必要としないメソッドです。 クラスの名前空間に属しつつ、クラスやインスタンスに依存しない汎用的な処理をまとめておくために用いられます。 デコレータ@staticmethodを用いて定義します。

静的メソッドの実装

静的メソッドは、クラスやインスタンスに依存しないメソッドで、@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

説明

  • クラスメソッドの定義:

    • @classmethod デコレーターを使用してメソッドを定義します。
    • 第一引数に cls を取ることで、クラス自体にアクセスできます。
  • 静的メソッドの定義:

    • @staticmethod デコレーターを使用してメソッドを定義します。
    • メソッド内で selfcls を使用しないため、クラスやインスタンスに依存しません。

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

ここでは、数学的な操作を提供する 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コードを書いてメソッドを呼び出しながら試してみることで、メソッドの概念とその使い方をより深く理解することができます。

出力結果: