こんにちわlisです!
Pythonのクラスに使うデコレータ@classmethod
というものを知ったので、ざっくり解説です!
@classmethodとは?
普通のクラス内にあるメソッドは、クラスをインスタンス化することで使えます。
>>> class Hoge: ... def func(self): ... print('hello!') ... >>> h = Hoge() >>> h.func() hello!
しかしクラスメソッドは、インスタンス化しなくても使うことのできるメソッドです。
@classmethodの挙動確認
こんなクラスを用意しました。
普通のメソッドとクラスメソッドを持っています。
class Hoge: def func(self): print('func') @classmethod def cmfunc(cls): print('@classmethod func')
クラスインスタンスからコール
普段どおりクラスをインスタンス化してコールしてみます。
>>> hoge = Hoge() >>> >>> hoge.func() func >>> hoge.cmfunc() @classmethod func
ちゃんと動作しました。
インスタンス化せずにコール
今度はインスタンス化せずに、クラスから直接コールしようとします。
>>> Hoge.func() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: func() missing 1 required positional argument: 'self' >>> Hoge.cmfunc() @classmethod func
通常はエラーが発生しますが、クラスメソッドは正常に動作します。
@classmethodは何が違うの?
書き方として違うところは
class Hoge: @classmethod def cmfunc(cls): print('@classmethod func')
- メソッドの上の行に
@classmethod
を書く - 引数に
self
でなくcls
を書く
の2つです。
なのでself
をそもそも持っていないので、メンバ変数は使えません。
参考
コチラを参考にしました。ありがとうございました!
あとがき
Python3 @classmethodはインスタンスなしでコールできるでした!
Pythonもまだまだ知らないことがたくさんありますねぇ。