目次
1.実行環境
- Debian7.11
- Python2.7
2.Pythonでの扱えるメソッドについて
Pythonで定義できるメソッドとして、下記の3つがあります。
- インスタンスメソッド
- クラスメソッド
- スタティックメソッド
それぞれのメソッドについて定義方法と実際の動作を見ていきましょう。
3.インスタンスメソッドを定義してみよう
インスタンスメソッドの定義方法については、defの後にメソッド名を記述してメソッドの引数に必ずselfを受け取るようにします。
method_sample.py
#_*_ coding: utf-8 _*_ class MethodSample: def instanceMethod(self): return "instanceMethod"
4.クラスメソッドを定義してみよう
クラスメソッドの定義方法については、defの後にメソッド名を記述してメソッドの引数に必ずclsを受け取るようにします。 そしてメソッド定義の上の行に「@classmethod」のデコレータを付与します。 ※javaで言うところのアノテーションですね。
method_sample.py
#_*_ coding: utf-8 _*_ class MethodSample: def instanceMethod(self): return "instanceMethod" @classmethod def classMethod(cls): return "classMethod"
5.スタティックメソッドを定義してみよう
スタティックメソッドの定義方法については、defの後にメソッド名を記述するだけで、必ず受け取る引数はありません。 そしてメソッド定義の上の行に「@classmethod」のデコレータを付与します。
method_sample.py
#_*_ coding: utf-8 _*_ class MethodSample: def instanceMethod(self): return "instanceMethod" @classmethod def classMethod(cls): return "classMethod" @staticmethod def staticMethod(): return "staticMethod"
6.各メソッドを呼び出してみよう
まず初めにインスタンス化しない状態で各メソッドを呼び出してみましょう。
以下サンプルプログラム
main.py
#_*_ coding: utf-8 _*_ from method_sample import MethodSample; print MethodSample.instanceMethod() print MethodSample.classMethod() print MethodSample.staticMethod()
実行してみます。
root@dev:~/tmp/python# python main.py Traceback (most recent call last): File "main.py", line 5, in <module> print MethodSample.instanceMethod() TypeError: unbound method instanceMethod() must be called with MethodSample instance as first argument (got nothing instead)
ちょうどインスタンスメソッドの箇所でエラーが発生しています。
main.py
#_*_ coding: utf-8 _*_ from method_sample import MethodSample; #print MethodSample.instanceMethod() print MethodSample.classMethod() print MethodSample.staticMethod()
実行してみると
root@dev:~/tmp/python# python main.py classMethod staticMethod
正常に処理されました。
つまり、インスタンスメソッドはインスタンス化しないと呼び出せません。
ではインスタンス化した場合はどうでしょう。
main.py
#_*_ coding: utf-8 _*_ from method_sample import MethodSample; methodSample = MethodSample() print methodSample.instanceMethod() print methodSample.classMethod() print methodSample.staticMethod()
実行してみます。
root@dev:~/tmp/python# python main.py instanceMethod classMethod staticMethod
各メソッドが呼び出せますね。
インスタンスメソッドはインスタンス化すれば呼び出せるメソッドです。 そして、今回はあまり凝ったことを行っていないのですが、インスタンスごとに状態がことなればインスタンスごとに異なった結果を返したい場合にインスタンスメソッドとして定義します。
ちなみにクラスメソッドとスタティックメソッドはインスタンス化しなくても、しても呼び出せるメソッドです。 では、どのようにこの2つのメソッドを使い分けていけばよいのでしょうか?
それは、クラスに依存するような処理の場合はクラスメソッドとして定義して、依存しない処理の場合はスタティックメソッドとして定義します。
クラスメソッドはクラス自身を引数に取りますので、そのようにすみ分けをしっかりしておけばメンテナンスもしやすくなるかと思います。
以上