3.22. クラスメソッド

クラスメソッドはクラスから直接呼び出せるメソッドです。つまりインスタンスであるオブジェクトを作らなくても呼び出すことができます。以下の例をpython コンソールで入力してその実行結果をみながらクラスメソッドの機能を説明します。

@classmethod

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
  import datetime

  class MyClass3:
      # 初期化メソッド
      def __init__(self, min,sec):
          self.minutes = min
          self.second = sec
      # 通常のメソッド
      def method1(self):
          print("minute=",self.minutes)
          print("second=",self.second)
      # クラスメソッド
      @classmethod
      def method2(cls, diff=0):
          sec1 = datetime.datetime.now().second + diff
          min1 = datetime.datetime.now().minute
          return cls(min1,sec1)

13行目 @classmethod があり、14行目~17行目のmethod1がクラスメソッドとなります。@classmethodはデコレータと呼ばれるもので、@classmethodをメソッド定義の前に書くことでそのメソッドがクラスメソッドとして定義されます。

次に MyClass3 を使ったプログラム例をみながらクラスメソッドの機能を説明します。 以下をpython コンソールで入力すると、

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 # 通常のmethod1を実行
 object1 = MyClass3(1,1)
 object1.method1()

 # クラスメソッドを実行してクラスを作成
 object2 = MyClass3.method2()
 object2.method1()

 # クラスメソッドにパラメタを設定
 object3 = MyClass3.method2(100)
 object3.method1()

以下のような出力が得られます。(この例では時刻を用いており、一部の表示は時刻により異なります。)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
 >>> # 通常のmethod1を実行
 ... object1 = MyClass3(1,1)
 >>> object1.method1()
 minute= 1
 second= 1
 >>>
 >>> # クラスメソッドを実行してクラスを作成
 ... object2 = MyClass3.method2()
 >>> object2.method1()
 minute= 17
 second= 29
 >>>
 >>> # クラスメソッドにパラメタを設定
 ... object3 = MyClass3.method2(100)
 >>> object3.method1()
 minute= 17
 second= 129
 >>>

2行目ではMyClass3(1,1)でインスタンスを作っており、object1はminute=1, second=1となります。object1.method1()の結果は、

1
2
 minute= 1
 second=1

と、表示されます。

8行目ではこれに対し MyClass3.method2を使っています。method2はクラスメソッドであり、時刻をself.minuteとself.secondに設定します。もし実行したのが17分29秒であればこのように、

1
2
 minute= 17
 second= 29

という表示が得られます。

14行目では MyClass3.method3(100) という形で呼び出しており、diff=100の状態でクラスメソッドが実行されるので、もし現在の秒が29であればself.secには129が設定されます。したがって、

1
2
 minute= 17
 second= 129

と表示されます。