lisz-works

プログラミングと興味を貴方に

Python3 @classmethodはインスタンスなしでコールできる

【スポンサーリンク】

Python

こんにちわ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')
  1. メソッドの上の行に@classmethodを書く
  2. 引数にselfでなくclsを書く

の2つです。

なのでselfをそもそも持っていないので、メンバ変数は使えません。

参考

コチラを参考にしました。ありがとうございました!

docs.python.org

blog.pyq.jp

あとがき

Python3 @classmethodはインスタンスなしでコールできるでした!

Pythonもまだまだ知らないことがたくさんありますねぇ。

www.lisz-works.com

www.lisz-works.com