メソッドと関数のまとめ 【Python】

programming Python

メソッド(method)と関数(function)の違いについて、サンプルコードの形でまとめておきます。
実際にプログラムを動かして理解するのが最短です。スクリプトの動作に基づく形で、ポイントを整理します。

環境: Windows 10、Anaconda、Python 3.x

サンプルコード:関数とメソッドの違い

def function_circle1( radius1 ):                 # function 
   pi1 = 3.1415926 
   val1 = pi1 * ( radius1 ** 2 ) 
   return val1 

class Class_Calculate1: 
    def __init__( self ): 
        self.instance_variable1 = 3.1415926      # instance variable 
    def method_circle1( self, radius1 ):         # method 
        val1 = self.instance_variable1 * ( radius1 ** 2 ) 
        return val1 

# function 

print( "function " ) 
print( function_circle1( 10.0 ) )                # >> 314.15926 
print( "" ) 

print( 'len( "abc" )' )                          # function 
print( len( "abc" ) )                            # >> 3 
print( "" ) 


# method 

fm1 = Class_Calculate1() 
print( "method:1" ) 
print( fm1.method_circle1( 10.0 ) )              # >> 314.15926 
print( "" ) 

fm1.instance_variable1 = 3
print( "method:2 " ) 
print( fm1.method_circle1( 10 ) )                # >> 300 
print( "" ) 

print( '"a,b".split(",")' )                      # method 
print( "a,b".split( "," ) )                      # >> ['a', 'b'] 

サンプルコードの説明

関数 function の例

・ サンプルコードで、最初に def function_circle1() として定義しているのが、関数 (function) の例です。
・ 実行時は、インスタンス等を生成することなく、直接、単独で呼び出して実行できます。
サンプルコードでは、半径 10 の円の面積は、314.15926 と計算されます。
・ スクリプトの見た目のまま、単独で def で定義されていたら、関数 function という理解でよいと思います。(視覚的に覚えてしまえばよい。)
・ Python 標準の関数(function、組み込み関数)としては、print()、len() などがあります。
いずれも、単独でそのまま使用できます。

メソッド method の例

・ 一方、クラス Class_Calculate1 を定義し、その中で def method_circle1() としているのが メソッド(method) です。
・ スクリプトの見た目のまま、class の中で def となっているのが method という理解でよいと思います。(これも、視覚的に覚えてしまえばよい。)
・ メソッドを使用する場合は、まず、Class_Calculate1 クラスを呼び出してインスタンス instance1 を作ります。つぎに、インスタンス名+ドット “.” + メソッドとして実行します。

私は、クラスの概念を勉強しはじめたころ、クラスを定義した後、「インスタンスを生成する」というところが理解しづらかった(二度手間に見える)のですが、ハードディスク上に書かれたスクリプトをインスタンスを定義する命令を実行することで、インスタンスに対応したメモリ領域が不揮発メモリ RAM 上に確保される、と理解したところ、すんなり納得ができました。インスタンスを2個定義すると、2個分の領域が確保される、等です。(どこまで正確かはどうあれ。。)

・ 参考までに、スクリプトでは、メソッドに加えて、変数を呼び出す例を記載しています。インスタンス変数 instance_variable1 も、メソッドと同様に、instance + “.” + 変数名とすることで、呼び出し、書き換え等ができます。
・ Python 標準のメソッド (method) としては、split() や join()、append() などがあります。いずれも、”.split()”、”.join()” 等として使用します。メソッドの直前には、ドット “.” がくるという理解でよいと思います。
・ 続いて、”a,b” という文字列、値を作り、そのデータ型に紐づけられているメソッド .split() を呼び出しています。
明示的には class を呼び出していませんが、文字列 “a,b” をスクリプト上で定義(実行)した時点で、文字列型のオブジェクトが生成されていますので、実質的にインスタンスを定義しているのと同等となって、結果、メソッドが機能する、ことが理解できます。

紛らわしい例 ~ import

・ なお、Python のメソッドに関し、仕様として紛らわしい例として、import する場合があります。
例えば、スクリプトの冒頭で import os とし、path1 =os.path.dirname(__file_) 等として、パスを取得するような場合です。
この場合、”os.path.…” の “.path” 以下は、”.” を使ってはいるものの、メソッドではなく関数です。
import os 自体はインスタンスを定義しているわけではなく、他のモジュールを呼び出しているだけからです。
Python では、メソッドの実行に加え、他のモジュール(*.py ファイル)に書かれた関数を呼び出す際にも “.” を使う、という紛らわしい仕様になっています。
この import で関数を呼び出す方法については、つぎの関連リンクでもまとめています。理解が追いついている方は、参考にしてみてください。動かしてみるのが一番理解が早いです。
※ 他のスクリプトの関数を実行する

少し考察してみる

他のプログラミング言語との比較

つぎに、メソッドと関数について、複数のプログラミング言語を比較すると以下となります。
いくつかの言語を知っていると、メソッドと関数の「違い」がより的確に理解できると思います。

・ C言語では、関数 function のみが使用できる。
・ C# と Java では、メソッド method のみが使用できる。
・ C++ と Python では、関数、メソッドのいずれも使用できる。
(class を定義するか否かで)

C言語しか知らない、Java しか知らないといった場合は、メソッドと関数の違いを正確に理解することが難しいように思われます。(こういったあたりも、手元の書籍を見る限りはズバリ書かれたものが見つからないように思われます。Python の本ですと Python についてしか書かれていないようです。)
ちなみに、VBA, VB では、Worksheet( “Sheet1”).Activate、Range( “A1” ).Value = “123” という書き方ができました。関数、メソッドのいずれも使用できることになります。

なぜ、混乱しやすいか

・ Python のプログラミング言語についてネット検索すると、メソッドと関数の違いをあまり意識せず説明したサイトが多いです。
たとえば、「len() は文字数を調べるメソッドです」とした説明があります。この説明の後、class を理解しようとすると、class でのメソッドが異なる意味あいで使用されており、使い方も異なるため、混乱します。

・ また、「メソッドとは、…クラス内で定義される…関数です」等とした説明もあります。この説明ですと、メソッドは関数の一種と読めます。一方、メソッドと関数を重複のない、対立した概念で説明したサイトもあり、混乱する一因となっています。なお、このサイトでの説明は、メソッドと関数を重複なく分けた説明としています。

・ また、「メソッドと関数の違い」とした表現が多いですが、片方が英語(カタカナ書き)、片方が日本語になっています。「メソッドとファンクションの違い」なら、まだよいです。わざわざ片方を英語にして、片方を日本語にして説明しているので、「なぜ片方だけ英語にするのだろうか、メソッドを平易な日本語に訳すとどうなるのだろうか」などと邪念が沸くと、正確な内容がわかりにくくなってしまいます。
・ 加えて、プログラミングとはまったく別の、たとえ話で説明されているものもあります。(クラスは鋳型です、とか。。) この場合、たとえ話と実際のプログラムが直接的に結びつかないので、読めば読むほど混乱する人もいるのではないかと思います。

まとめ

メソッド(method)と関数(function)の違いについて、実際の動くサンプルコードに基づいてポイントを整理しました。

私の場合、プログラミングはC言語等から入っています。関数とメソッドの両方を Python のスクリプトで作ってみて、動かす過程を経験すると、よく理解できたと思います。
プログラムの動作に即した形で端的に「違い」を説明している書籍やサイトをほとんど見かけませんでした。
そこで、「こう説明してもらえていたら、時間を無駄にせずに済んだのに」と思っていたあたりについてまとめてみました。

関連リンク
・ 「参照」に関するポイントまとめ 【Python】
・ クラスのポイントまとめ 【Python】
・ 他のスクリプトの関数を実行する
・ Python で他の Python スクリプトごと実行する方法
・ おすすめ書籍 ピックアップ 【機械学習】

タイトルとURLをコピーしました