クラスメソッド
ここまでに紹介してきたメソッドはインスタンスに属するインスタンスメソッドであった。インスタンスメソッドはインスタンス変数によって保持された内部状態を用いて、インスタンス毎に個別の結果を得るような用途に利用される。
Dogクラスから「ポチ」「ハチ公」「パトラッシュ」インスタンスを生成し、それぞれの名前や体力をインスタンス変数を用いて管理する。
これに対して、数学における正弦関数$ \sin( )のような処理は内部状態を保持する必要が無い。いっぱんに、このような処理は関数を用いて実装されるが、何らかの目的のために、その機能をあるクラスにまとめる必要がある場合にはクラスメソッドとして実装する。
https://scrapbox.io/files/6528e8a6a75d31001b5845fe.png
インスタンスメソッドはクラスをもとに生成したインスタンスの個数だけ存在するが、クラスメソッドはクラスに対して一意に存在するものである。
特徴:
クラスに属し、 インスタンス化することなく利用できる
自身が属するクラスに関する情報を持つ
クラスのオブジェクトID
クラス定義文が実行されると、クラス型のオブジェクトがメモリ上に生成される。次の例はMyclassクラスのオブジェクトIDを確認している。
code:clasmethod11.py
class Myclass:
pass
print(id(Myclass))
クラスメソッドの定義
クラスメソッドはデコレータ「@classmethod」を用いて定義する。メソッドの定義文の直前にこのデコレータを置かれたメソッドはクラスメソッドとなる。クラスメソッドの第1引数は自身が属するクラスのオブジェクトIDであるが、Pythonでは慣習的にこの値をclsという変数で受け、そのクラスが形成するローカルスコープの指定に利用する。
code:classmeth12.py
class Myclass:
@classmethod
def method(cls):
pass
スコープ外からの利用
クラスメソッドはクラスを定義する時に作られる。そのためインスタンスメソッドとは異なりインスタンス化することなく利用できる。クラスメソッドを呼び出すには、クラス名を識別子として利用する。
code:classmeth13.py
class Myclass:
@classmethod
def method1(cls):
print('内:このクラスのidは変数clsに格納されます', id(cls))
print('外:Myclassクラスのオブジェクトid', id(Myclass))
Myclass.method1() # (1):クラスメソッドの呼出し
今までのメソッドとは異なり、インスタンス化の手続きを行っていないことに注意しよう。
ローカルスコープからの利用
クラス内で作られたオブジェクト(クラス変数、クラスメソッド)はそのクラスが形成したローカルスコープに属する。このスコープは変数clsを用いて指定される。
code:classmeth14.py
class Myclass:
data = 'クラス変数'
@classmethod
def method1(cls):
print('method1が呼び出されました')
cls.method2() # (1):クラスメソッドの呼出し
print(cls.data) # (2):クラス変数の参照
@classmethod
def method2(cls):
print('method2が呼び出されました')
Myclass.method1()
ここでは2つのクラスメソッドを定義している。
変数selfを用いて利用されるインスタンスメソッドとの違いを確認してください。(インスタンス内でのメソッドの呼出し)
補足:クラスメソッド(補足)
/icons/hr.icon
※ ブラウザのバックボタンで戻る