python3の日記

Python3を図書とともに勉強していくブログ

Pythonにおけるメソッドと関数の違い

メソッド∈関数

初めてのPythonの第Ⅱ部【ビルドインオブジェクト】からメソッドや関数の話が入るようになる。その定義や詳細な説明もなく「もちろん知ってるでしょ?」的な前提を元にペラペラと。

 

Pythonは比較的新しい言語であるため、JavaやCやってた人向けにこの本が書かれてるってとこある。初めてのPython、分厚く”初めて”って言葉が入ってる割に基礎的な説明があんまりなんだよなぁ…

詳しく調べるまで、ぼくの中では

【関数】

function(引数)→戻り値

 

【メソッド】

オブジェクト.method()→戻り値

 

のイメージ。どちらも対象(引数orオブジェクト)をそれぞれ操作しその結果できた戻り値を返す、という感じだと思ってた。後日list.append()メソッドの出現によりそのイメージは崩壊を迎える…

ネット辞書で調べてみる。

関数(ファンクション)

関数とは、引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群。多くのプログラミング言語では、関数がプログラムを構成する要素となっている。多くの言語や処理系では、開発者の負担を軽減するため、よく使う機能が関数としてあらかじめ用意されている。

引用:関数とは? – IT用語辞典

メソッド 【 method 】 メンバ関数 / member function

メソッドとは、方法、方式、手法、やり方、などの意味を持つ英単語。ITの分野では、オブジェクト指向プログラミングにおいて各オブジェクトに属する処理や操作のことや、通信プロトコルにおける要求の種類などのことをメソッドということが多い。一般の外来語としては、一定の形式として確立した奏法、教授法、指導法、その他様々な技法のことを「○○メソッド」のように言う。

引用:メソッドとは? – IT用語辞典

……???もっと私文にも分かる言葉使え。

メソッドと関数の違い、何なんだろうな~これ。『メソッド 関数 違い Python』で検索すると、多少なりともその話題のブログがヒットするんだけどなかなか的を射たものが見つかんね。

 

その中で、「これかな?」と比較的腑に落ちたのがこのブログ。

d.hatena.ne.jp

この前後合わせて5つぐらいの記事を読んでみると、なんとなく納得できた。なんとなくね。加えてwikiのこの記事内の一文。

メソッド (計算機科学) - Wikipedia

メソッドと通常の関数の違いは主にインスタンス内部へのアクセスの有無である

 を元に自分なりの理解を書いていこうと思う。

 

その前に、まずは言い訳。

以前読んだプログラミングの記事にも書いてあったことだけど

「"プログラミングとはなにか"についてすら共通した定義が定まっていないプログラミングの世界において、各用語が表すのは、『愛』とか『正義』とか『国家』といったの定義同様、極めて曖昧な概念であり、そこまで厳密に考える必要はない。

 と。なので、以下にはふんわりと掴んだことを。

 

始める前に、大前提のふんわり情報として

メソッド∈関数

をあげておく。これはメソッドと関数の違いについて書いてあるどのブログにも書いてあった。メソッドも関数もそれぞれ述語であり、与えられた物(インスタンス)について定義された一連の操作を行うものだからである。

関数は抽象的な操作でありメソッドは具体的な操作である。

オブジェクト指向とは

 メソッドと関数の話が知りたいのになんでオブジェクト指向の話??!?と思う方も多いかもしれない。ぼくもそうだった。だって、『メソッド 関数 Python 違い』で調べると決まってオブジェクト指向の話が載ってるんだもん。

オブジェクト指向はまだ学んでないのでその話はちょっと…」

だよね。でも、メソッドの説明においてオブジェクト指向の話は避けては通れないのでせめて語感だけでもいいから掴んで欲しい。

 

プログラミング言語界においては、言語は大きく分けて2種類に分かれる。命令型プログラミングオブジェクト指向プログラミングだ。

 

前者は主に”述語”(関数)を定義する。

吠える」という具合に。

それに対し後者は”主語”(オブジェクト)も定義できる。

ライオン吠える」という具合に。

 

定義されたオブジェクト(主語)にはそれだけに対応した述語も定義できる。

「ガルルと低い声」

「警告の意味がある」

「千里を駆ける」

 

こうして色々な主語情報を定義できるため命令型プログラミングでは「吠える」(高い声?低い声?)(警告?挨拶?)としか定義できないところを、オブジェクト指向プログラミングでは「ライオンが吠える」という一言に(地響きのように低い声で)(警告の意味がある)という感じで、とても具体性を持たせることができる。この”吠える”がそれぞれ関数であり、メソッドである。

 

つまり、メソッドとは

オブジェクト指向における特定のオブジェクト内で働く関数

のことである。特定のオブジェクト内でしか呼び出せないという弱点はあるものの、より具体的に関数を実行することができるという利点もある。

 

オブジェクト指向についてはこの記事を参照。

python3.hatenadiary.jp

ビルトインオブジェクトのメソッド

メソッドとは、定義されたオブジェクトのなかで定義されている関数と言える。関数の構造を見るためにhelp関数を使うときは、help(function)で済むのに対してメソッドの構造を見るためにhelp関数を使うときはhelp(object.method)でないと見れないのはそのためだ。

 

なぜなら、メソッドはobject.以下においてしか存在できない関数であり、独立して存在し得ないからだ。

help(replace)
>>>NameError: name 'replace' is not defined
help(str.replace) #strは文字を表すビルトインオブジェクト
>>>replace(...)
S.replace(old, new[, count]) -> str

Return a copy of S with all occurrences of substring
old replaced by new. If the optional argument count is
given, only the first count occurrences are replaced.
  
また、ビルトインオブジェクトをhelp関数の引数とすることで、そのビルトインオブジェクトにデフォルトで用意されたビルトインメソッドの一覧を見ることが出来る。
help(str)
>>>Help on Class str in module builtins:
class str(object)
| str(object='') -> str
| str(bytes_or_buffer[, encoding[, errors]]) -> str
|
| Create a new string object from the given object. If encoding or
| errors is specified, then the object must expose a data buffer
| that will be decoded using the given encoding and error handler.
| Otherwise, returns the result of object.__str__() (if defined)
| or repr(object).
| encoding defaults to sys.getdefaultencoding().
| errors defaults to 'strict'.
|
| Methods defined here:


結論

メソッドとは関数の一種であり、特定のオブジェクトの中でしか使えない関数のことである。