12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

クラスメソッドとスタティックメソッドのいろいろ

Posted at

#はじめに
この記事では「クラスメソッド」とは何かについて書いていきます。
前回までの記事



pythonのプロパティのあれこれ

#クラスメソッドとは
簡単に一言で言えば、「クラス変数のようにクラスから直接使用できるメソッド」のことです。
(メソッドとはクラス内の関数のことです)

@classmethod
def メソッド名(cls, 引数1, 引数2, ...): 

これがクラスメソッドの形です。今まで見てきた関数とは違う部分がいくつかあるので、見分けがつきやすいと思います。
①インスタンス(実体)が存在しないので、自分自身を表す'self'は用意されません。
②'self'の代わりに'cls'という引数が用意され、クラスメソッドが保管されているクラスのオブジェクトが代入される。

クラスメソッドを呼び出す際は、クラスから直接呼び出すことが可能です。

#クラスメソッドの呼び出し
クラス名.クラスメソッド名()

#通常のメソッドの場合
hello = クラス名   #インスタンス作成
hello.メソッド名    #メソッドの呼び出し

呼び出しの部分も違うので、使う際には注意してください。

#クラス変数
先ほどクラスメソッドのことを、「クラス変数のようにクラスから直接使用できるメソッド」と言いました。
しかしそもそもクラス変数が何かわからないと、何のことかさっぱりだと思います
クラス変数とは下のコードの「message」の部分です。

class Lesson:
    message = 'OK'

    def print(self):
        print(Lesson.message)

le = Lesson()            #インスタンス作成
le.print()               #printメソッド呼び出し
Lesson.message = 'Welcome!'    #'message'変数の中身を'Welcome!'に変更
le.print()                     #再び'printメソッド'呼び出し
print(Lesson.message)          #クラス変数messsageも呼び出し

普通の変数とパッと見変わらないので、そんなに難しくないと思います。

一番最後をみてもらえればわかるように、インスタンスを作成しないでも、クラスから直接呼び出すことができます。
メソッド(defがついているもの)と違い、インスタンスではなくクラスそのものに値を保管しているからです。

そしてクラス変数とメソッドを合わせたものがクラスメソッドです。
クラスから直接呼び出せて、変更も簡単にできるというものです。

#クラスメソッドの活用例

class MyObj:
  message = 'OK'
  
  @classmethod
  def print(cls):
    print(cls.message)
    
MyObj.print()   #OK
MyObj.message = 'Welcome!'
MyObj.print()   #Welcome!
print(MyObj.message)  #Welcome!

#通常のメソッドの場合
#mo = MyObj()
#mo.print()

インスタンスを作成せずに、クラスから直接呼び出せていることが確認できると思います。
値の変更も簡単にできるので通常のメソッドとは違うことがわかります。

#インスタンスを作成
では、通常のメソッドとクラスメソッドを用意し、インスタンスを作成したときにどのような動きをするのか確認していきましょう。

class A():
  count = 0
  def __init__(self):
    A.count += 1      #インスタンスが作成されるたびに'count'が1足される
  def exclaim(self):
    print('I am an A!')
  @classmethod
  def kids(cls):
    print('A has', cls.count, 'title objects.')   #何回カウントされたかを表示
    
a = A()   #インスタンスを作成
b = A()   #インスタンスを作成
c = A()   #インスタンスを作成
A.kids()  #クラスメソッドの呼び出し  'A has 3 title objects.'

これはインスタンスが作成されるたびに'count'が1足されていくものです。

'a','b','c'で3回インスタンスを作成した後にクラスメソッドを呼び出して、何回カウントされたのかを表示しています。
3回インスタンスが作成されているので'count'が'3'足されているのが確認できます。
クラスメソッドを呼び出した時は、インスタンスが作成されないので足されていません。

#クラスメソッドとメソッドや関数との違いは?
ここでそれぞれの違いをまとめていきたいと思います。

#クラスメソッド
classmethod
def メソッド名(cls, 引数1, 引数2, ...): 
#メソッド
def メソッド名(self, 引数1, 引数2, ...): 
#関数
def 関数名():

このように並べてみると違いがよくわかると思います。
①クラスメソッドとメソッドの違い
->メソッドはインスタンスを作成しないと呼び出せないですが、クラスメソッドはクラスから直接呼び出すことができます。

②クラスメソッドと関数の違い
-> 第一引数に'cls'というクラス自体を取得することができます。また、クラスの中にあるので、クラスをインポートすれば使えるという点も違います。

#スタティックメソッド
ここからはスタティックメソッドについて説明していきます。
スタティックメソッドとはクラスメソッドとにていますが、違いは引数を指定する必要がない点です
実際に見ていきましょう。

@staticmethod
def メソッド名():
     print("これはスタティックメソッドです。")

#呼び出し
クラス名.メソッド名()

クラスメソッドの時は第一引数に'cls'というものがありましたが、スタティックメソッドにはありません。
メソッドとほとんど同じと思ってもらうとわかりやすいです。
あまり使われないですが、クラスメソッド同様クラスから直接呼び出し¥すことができるのが特徴です。

#終わりに
今回の記事では「クラスメソッド」と「スタティックメソッド」について書きました。
記事はこれからもアップデートしていく予定です。
前回までの記事



pythonのプロパティのあれこれ

12
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?