<一覧に戻る

メソッドの呼び出し

オブジェクト指向プログラミング(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 Dog:
    species = "Canis familiaris"

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

    def bark(self):
        print(f"{self.name} says woof!")

    @classmethod
    def get_species(cls):
        return cls.species
# クラスメソッドの呼び出し
print(Dog.get_species())  # 出力: Canis familiaris

# インスタンスを通じても呼び出せます
my_dog = Dog("Buddy", 3)
print(my_dog.get_species())  # 出力: Canis familiaris

説明

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

  • クラスメソッドの呼び出し:

  • クラス名 Dog を通じて直接呼び出すことができます。
  • インスタンス my_dog を通じても呼び出すことができますが、通常はクラス名を使います。

実践例:銀行口座クラス

ここでは、銀行口座を表す BankAccount クラスを作成し、メソッドの呼び出し方を具体的に見てみましょう。

class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance

    def deposit(self, amount):
        self.balance += amount
        print(f"{self.owner}さん、{amount}円を入金しました。現在の残高は{self.balance}円です。")

    def withdraw(self, amount):
        if amount > self.balance:
            print("残高不足です。")
        else:
            self.balance -= amount
            print(f"{self.owner}さん、{amount}円を引き出しました。現在の残高は{self.balance}円です。")

    def get_balance(self):
        return self.balance
# BankAccountクラスのインスタンスを生成
account1 = BankAccount("佐藤", 10000)
account2 = BankAccount("鈴木")

# メソッドの呼び出し
account1.deposit(5000)      # 出力: 佐藤さん、5000円を入金しました。現在の残高は15000円です。
account1.withdraw(2000)     # 出力: 佐藤さん、2000円を引き出しました。現在の残高は13000円です。
print(account1.get_balance())  # 出力: 13000

account2.deposit(3000)      # 出力: 鈴木さん、3000円を入金しました。現在の残高は3000円です。
account2.withdraw(5000)     # 出力: 残高不足です。
print(account2.get_balance())  # 出力: 3000

説明

  • オブジェクト生成:
  • account1account2 は、それぞれ異なるオーナーを持つ BankAccount クラスのインスタンスです。
  • __init__ メソッドが自動的に呼び出され、各オブジェクトの ownerbalance が初期化されます。

  • メソッドの呼び出し:

  • deposit メソッドを呼び出すことで、指定した金額を口座に入金します。
  • withdraw メソッドを呼び出すことで、指定した金額を口座から引き出します。ただし、残高不足の場合は引き出しができません。
  • get_balance メソッドを呼び出すことで、現在の口座残高を取得します。

クラスメソッドと静的メソッド

Pythonでは、クラスメソッドと静的メソッドを使って、クラスレベルで機能を提供することができます。これにより、インスタンスに依存しないメソッドを定義できます。

クラスメソッド

クラスメソッドは、クラス自体に関連付けられたメソッドで、クラスの状態を操作するために使用されます。@classmethod デコレーターを使って定義します。

class Dog:
    species = "Canis familiaris"

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

    def bark(self):
        print(f"{self.name} says woof!")

    @classmethod
    def get_species(cls):
        return cls.species
# クラスメソッドの呼び出し
print(Dog.get_species())  # 出力: Canis familiaris

# インスタンスを通じても呼び出せます
my_dog = Dog("Buddy", 3)
print(my_dog.get_species())  # 出力: Canis familiaris

静的メソッド

静的メソッドは、クラスやインスタンスに依存しないメソッドで、@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コードを書いてメソッドを呼び出しながら試してみることで、メソッドの概念とその使い方をより深く理解することができます。

参考資料

出力結果: