Skip to content

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つの引数が両方とも出力されて正常終了します。