3秒でわかる
特定のデータに結びついた関数。そのデータ自身を操作する手続きをまとめておく書き方で、オブジェクトの「できること」を表します。
もう少し詳しく
どういうものか
メソッドは、あるオブジェクトやクラスに属する関数です。呼び出すときは オブジェクト.メソッド名() という形になり、呼び出した相手そのものを操作対象として受け取ります。
"hello".upper() の upper は文字列型のメソッド、[3, 1, 2].sort() の sort はリスト型のメソッドです。どちらも「誰に対しての操作か」が呼び出し方の中に含まれています。
なぜ必要か
データとその扱い方を 1 か所にまとめられるからです。関数だけで書くと、口座の残高という値と、入金や出金という手続きが別々の場所に散ります。誰でも残高を直接書き換えられるので、手数料を引き忘れた更新が紛れ込みます。
メソッドとして持たせると、残高を変える経路が決まった手続きだけになり、その中で条件の確認や記録をまとめて行えます。
具体例
class Account:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
def deposit(self, amount):
if amount <= 0:
raise ValueError("金額は正の数にする")
self.balance += amount
return self.balance
acc = Account("tanaka")
acc.deposit(1000)
print(acc.balance) # 1000self は呼び出したオブジェクト自身です。acc.deposit(1000) は内部的に Account.deposit(acc, 1000) と同じで、第 1 引数に呼び出し元が渡されます。JavaScript の this、Java の暗黙の this も同じ役割です。
つまずきやすいところ
呼び出しの括弧を忘れる誤りが多いです。acc.deposit は関数そのものを指すだけで実行されません。エラーも出ずに何も起きないため、原因に気付きにくい部類です。
戻り値の有無も混同しやすい点です。Python のリストの sort() は自身を並べ替えて None を返すので、lst = lst.sort() と書くと中身が消えます。並べ替えた新しいリストが欲しいときは関数の sorted() を使います。破壊的か非破壊的かは、メソッドごとに調べる習慣が要ります。
似た用語との違い
| 語 | 説明 |
|---|---|
| 関数 | 単独で呼べる処理のまとまり |
| メソッド | オブジェクトに属する関数 |
| 属性 | オブジェクトが持つ値 |
| コンストラクタ | 生成時に一度だけ呼ばれる特別なメソッド |
覚え方
属性が名詞、メソッドが動詞です。