さっしーブログ

埼玉県在住のシステムエンジニアです。基本的には技術的な内容を中心に発信していきます。

Python入門 メソッドについて

f:id:y_saiki:20171024233602j:plain

目次

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つのメソッドを使い分けていけばよいのでしょうか?

それは、クラスに依存するような処理の場合はクラスメソッドとして定義して、依存しない処理の場合はスタティックメソッドとして定義します。

クラスメソッドはクラス自身を引数に取りますので、そのようにすみ分けをしっかりしておけばメンテナンスもしやすくなるかと思います。

以上