Pythonでは通常のメソッド(クラスの外で定義するメソッド)の他にクラスメソッド、インスタンスメソッド、スタティックメソッドと呼ばれるものがあります。
インスタンスメソッドはクラス宣言の中に、クラスメソッドとスタティックメソッドは関数定義の前に「@classmethod」「@staticmethod」というデコレータを付けて宣言します。
- インスタンスメソッドはクラス内にデコレーターなしで宣言
- クラスメソッドはクラス内に@classmethodデコレーターを付加して宣言
- スタティックメソッドはクラス内に@staticmethodデコレーターを付加して宣言
以下にそれぞれのメソッドの特徴と利用方法を解説していきます。
Pythonのメソッドの種類
Pythonでは通常のメソッド(クラスの外で定義するメソッド)の他にクラスメソッド、インスタンスメソッド、スタティックメソッドと呼ばれるものがあります。
クラスメソッドはインスタンスを生成しなくても呼び出せるメソッドで、スタティックメソッドはクラスやインスタンス自身を受け取る必要がないメソッドの場合に宣言します。
インスタンスメソッドとは
インスタンスメソッドは通常のクラス宣言の中で特別なデコレーターを設定することなく宣言されているメソッドで、クラスをインスタンス化することで利用することができるようになるメソッドです。
class MyClass(): def instance_method( self ): print( "instance_method()" )
と第一引数に自身のインスタンスへの参照を引数を持つメソッドになります。
使い方はクラスをインスタンス化して
class MyClass(): def instance_method( self ): print( "instance_method()" ) myclass = MyClass() myclass.instance_method()
となります。
実行した結果は
instance_method()
になります。
クラスメソッド
クラスメソッドはインスタンスメソッドとは異なり、クラスをインスタンス化しなくても呼び出せるメソッドになります。
クラスメソッドはメソッドの宣言の前に「@classmethod」というデコレーターを付加して宣言します。
class MyClass(): @classmethod def class_method( cls ): print( "class_method()" )
第一引数には自身のクラスへの参照を引数を持つメソッドになります。
使い方はクラスをインスタンス化しなくても
class MyClass(): @classmethod def class_method( cls ): print( "class_method()" ) MyClass.class_method()
と「クラス名.メソッド名()」という形で呼び出すことができるようになります。
実行結果は
class_method()
になります。
スタティックメソッド
スタティックメソッドはクラス内で宣言されていますが、クラスやインスタンスの参照が不要の場合に利用するメソッドです。
スタティックメソッドはメソッドの宣言の前に「@staticmethod」というデコレーターを付加して宣言します。
class MyClass(): @staticmethod def static_method(): print( "static_method" )
上記のようにスタティックメソッドは自身のクラスやインスタンスへの参照の引数は取りません。
使い方は
class MyClass(): @staticmethod def static_method(): print( "static_method()" ) myclass = MyClass() myclass.static_method()
のようにクラスをインスタンス化して呼び出します。
実行結果は
static_method()
になります。
まとめ
Pythonのインスタンスメソッド、クラスメソッド、スタティックメソッドはそれぞれに特徴があり、適切に利用することで見通しのよいコードを作成する手助けになります。
それぞれデコレーターをつけるだけなので手軽に利用できるで便利ですね。
以上、Pythonのクラスメソッド、インスタンスメソッド、スタティックメソッドの違いでした。