7. メソッド
インスタンスメソッド、クラスメソッド、スタティックメソッド、の3種類について
7-1. インスタンスメソッド
クラス内で定義し、インスタンス化した上で実行可能となるメソッド。
def instance_method(self, param1):
のように定義し、暗黙パラメータのselfを介して、クラス変数にアクセス可能が可能。 インスタンスメソッドの作成・実行例です。
class test1:
CLASS_PARAM = 100
def __init__(self, param):
self.param = param
def instance_method(self, param1):
print("@@ exec instance method.")
print(param1)
print(self.param)
print(self.CLASS_PARAM)
# print(param1.CLASS_PARAM) # エラー:AttributeError: 'str' object has no attribute 'CLASS_PARAM'
クラスを定義し、test1('TEST') でインスタンスを作成。 この時点で定数CLASS_PARAMに100がセットされ、クラス変数self.param には、引数で渡した「TEST」がセットされます。
t = test1('TEST')
t.instance_method('TEST-INSTANCE')
インスタンスメソッド t.instance_method('TEST-INSTANCE') を実行すると、 print(param1) で、渡したパラメータ「TEST-INSTANCE」が表示。 print(self.param) で、インスタンス作成時に設定した引数「TEST」が、 print(self.CLASS_PARAM) で、インスタンス作成時にセットされた定数100が出力されます。
# exec result.
@@ exec instance method.
TEST-INSTANCE
TEST
100
7-2. クラスメソッド
クラスメソッドでは、インスタンスを作成することなく、直接メソッドを実行できます。 定義前に「@classmethod」を付加(デコレート)することで定義可能。
第1引数には、selfではなく「cls」を使用。
@classmethod
def class_method2(cls, param2):
のように定義。
class test2: CLASS_PARAM = 100
def __init__(self, param):
self.param = param
@classmethod
def class_method(cls, param2):
print("@@ exec class method.")
print(param2)
# print(param2.CLASS_PARAM) # エラー:AttributeError: 'str' object has no attribute 'CLASS_PARAM'
# print(cls.param2) # AttributeError: type object 'test2' has no attribute 'param2'
print(cls)
print(cls.CLASS_PARAM)
最初に、上記同様、インスタンスを作成してから、下記を実行します。
>>> t = test2('TEST')
>>> t.class_method('TEST-CLASS')
@@ exec class method.
TEST-CLASS
<class '__main__.test2'>
100
print(param2) とすることで、渡したパラメータ「TEST-CLASS」が表示され、print(self.param) でインスタンス作成時に設定した引数「TEST」が出力されます。 print(self.CLASS_PARAM) で、インスタンス作成時にセットされた定数100が出力されます。
>>> test2.class_method('out class TEST-CLASS2')
@@ exec class method.
out class TEST-CLASS2
<class '__main__.test2'>
100
とすることで、print(param2) で渡したパラメータ「out class TEST-CLASS2」が表示されます。 t = test2('TEST') で作成されたインスタンスが残っているのでは?と思われる場合は、
del t
でインスタンスオブジェクトを削除してから、test2.class_method('out class TEST-CLASS2') を再実行してみてください。同じ結果が表示されるはずです。
7-3. スタティックメソッド
スタティックメソッドはクラスやインスタンスに依存しない、独立したメソッドです。 定義前に「@staticmethod」を付加することで定義できます。
@staticmethod
def instance_method(param1):
のように定義します。 クラスメソッドのようなclsや、selfといった暗黙パラメータは不要です。 使用しても普通の引数として扱われます。
class test3:
CLASS_PARAM = 100
def __init__(self, param):
self.param = param
@staticmethod
def static_method(param3):
print("@@ exec static method.")
print(param3)
# print(CLASS_PARAM) ## エラー:NameError: name 'CLASS_PARAM' is not defined
# print(self.param) ## エラー:NameError: name 'self' is not defined
@staticmethod
def static_method2(self, param3a): # ここのselfはただの変数(str)
print("@@ exec static method2.")
print(self)
# print(self.CLASS_PARAM) # エラー:AttributeError: 'str' object has no attribute 'CLASS_PARAM'
print(param3a)
インスタンスを作成せずに直接実行します。 print(param3) の部分で、パラメータで渡した'out class TEST-STATIC' という文字列が出力されます。
>>> test3.static_method('out class TEST-STATIC')
@@ exec static method.
out class TEST-STATIC
>>>
暗黙パラメータself(らしき)を定義した static_method2 を実行してみます。 引数self には文字列「TEST-STATIC2」を渡します。
>>> t.static_method2('TEST-STATIC2','STATIC-TEST')
@@ exec static method2.
TEST-STATIC2
STATIC-TEST
>>>
渡したパラメータ「TEST-STATIC2」「STATIC-TEST」がそれぞれ出力されます。 クラス変数の self.CLASS_PARAM を表示しようとすると、「selfという文字列変数に、CLASS_PARAMという属性は無い」とのエラーが出力されます。
最後にインスタンスメソッドのように実行してみましょう。
>>> t = test3('TEST')
>>> t.static_method('TEST-STATIC')
@@ exec static method.
TEST-STATIC
>>> t.static_method2('TEST-STATIC') # TypeError: test3.static_method2() missing 1 required positional argument: 'param3a'
>>> t.static_method2('TEST-STATIC1', 'TEST-STATIC2')
@@ exec static method2.
TEST-STATIC1
TEST-STATIC2
インスタンスに属するメソッドstatic_method('TEST-STATIC') として実行すると、 普通に「TEST-STATIC」という文字列が出力されて実行できます。 ただし、後者のstatic_method2 を引数1つだけを与えて実行してみると、selfはやはり普通の文字列引数として扱われ、 引数が足りないとのエラーになります。
t.static_method2('TEST-STATIC1', 'TEST-STATIC2') として実行すると、2つの引数が両方とも出力されて正常終了します。