メソッドと関数は、何が違うのか。そもそも何で呼び分けるのか。メソッドの実体も同じく関数なので、このような疑問を抱くのは当然です。
メソッドとは「クラス内で定義された関数」や「オブジェクトの属性として参照される関数」などと説明されますが、クラスを学んでいない段階でこの説明を聞いてもピンときません。
しかし、一般的なPythonの参考書では、リストのappend()
メソッドなどは、クラスのページのずっと前に登場します。
では、関数とメソッドの違いは、クラスを学んでからでないと理解できないのでしょうか。いいえ、「使い方」に着目すれば、簡単に区別できます。
今回はオブジェクト指向プログラミング(OOP)の概念に触れないで、「関数とメソッドの違い」をわかりやすく説明します。
呼び出し方の違いに着目する
使い方、つまり呼び出し方の違いに着目すると、関数とメソッドは以下のように区別されます。
- 単独で呼び出しできるのが「関数」
- 変数や値に付けて呼び出すのが「メソッド」
例えば、Pythonの組み込み関数のprint()
、len()
などは単独で呼び出せる「関数」です。
>>> print("Hi, Ichiro.")
Hi, Ichiro.
>>> len(["one", "two", "three"])
3
一方、リストに要素を追加するappend()
や文字列を繋ぐjoin()
は変数や値に付けて呼び出す「メソッド」です。以下のように変数や値の後にドット(.
)を付けて呼び出します。
>>> num_list = ["one", "two"]
>>> num_list.append("three")
>>> num_list
['one', 'two', 'three']
>>> "+".join(num_list)
'one+two+three'
メソッドの種類はデータ型で異なる
上の例のappend()
とjoin()
は、それぞれリスト型と文字列型に準備されているメソッドです。メソッドはデータ型に紐付いた関数なので、このように呼び出せる種類はデータ型で異なります。
例えば、以下の表からappend()
メソッドは、リスト型の変数については使えますが、辞書型からは呼び出せません。一方、pop()
のように両方で使えるメソッドもあります。
変数や値のデータ型 | 使用できるおもなメソッド |
---|---|
リスト型(list) | append() 、pop() 、extend() 、sort() |
辞書型(dict) | get() 、pop() 、update() 、items() |
紛らわしいケース
モジュールの関数もドット(.
)を付けて呼び出します。メソッドと混同しやすいので気をつけてください。例えば、以下のgetcwd()
は、os
モジュールの関数です。
>>> import os
>>> os.getcwd()
'/Users/ichiro'
getcwd()
のドットの前のos
はモジュール名ですが、メソッドの場合はドットの前が変数や値になります(つまり、データ型を有するもの)。
最後に
メソッドと関数は「そもそも何で呼び分ける必要があるのか」と疑問に感じると思いますが、今回説明したように使い方(呼び出し方)が違うので、明確に区別しておきます。
プログラミング言語はプログラムを作成するための「道具」です。道具には必ず使い方があります。だから、概念がよく理解できない時は、使い方からアプローチすると分かりやすくなります。