calendarcodediamondfacebookfingerglobalgoogleplushatenahomepagetopplainpocketrssservicetwitterwordpresshome2searchfoldernext-arrowback-arrowfirst-arrowlast-arrow

Python : クラスの使い方 4(クラスメソッド、スタティックメソッド、クラス変数)

クラス変数やクラスメソッドは、クラスオブジェクトの属性なので、インスタンスを生成することなくアクセスできる。スタティックメソッドも、インスタンスを生成することなくアクセスできるが、インスタンス変数やクラス変数にはアクセスできない。

エンジニア速報は Twitter の@commteで 1 日 5 回配信しています。

Sponsored Link

目次

ポイント

クラスメソッドの特徴

  • 処理を追加する機能を持つ
  • クラス全体に影響を与える
  • インスタンス変数にはアクセスできない
  • インスタンス生成せずにアクセス可能
  • @classmethod デコレータを付加する
  • 第一引数は cls と記述

スタティックメソッドの特徴

  • インスタンス生成せずにアクセス可能
  • インスタンス変数やクラス変数にはアクセス不可
  • @staticmethod デコレータを不可する
  • 第一引数は self や cls を取らない

クラス変数の特徴

  • クラスオブジェクトに紐づき、クラス全体で共有される

デコレータとは

デコレータとは、関数やクラスの前後に処理を追加する機能のこと。先頭に @ がつく。クラスメソッドは、デコレータの一種である。

参考:デコレータは既存の関数に機能を追加する関数

Python において、メソッドは次の 3 つのタイプがある。インスタンスメソッドはデコレータがついてないが、それ以外はデコレータがついている。

各 メソッドの違い

メソッドのタイプ デコレータ 第一引数
インスタンスメソッド なし self
クラスメソッド @classmethod cls
静的メソッド @staticmethod オブジェクト以外

クラス変数

クラス変数は、クラスオブジェクトに紐づく変数である。クラス全体のインスタンスで同じ変数が共有される。

class Hoge: a = 'Hello' Hoge.a # 'Hello'

クラスメソッド

クラスメソッドはクラス全体に影響を与え、クラスに加えた変更は、すべてのオブジェクトに影響を与える。

class Hoge: @classmethod def a(cls): # クラスメソッド print("Hello") Hoge.a() # 'Hello'

デコレータである @classmethod を入れると、その次のメソッドはクラスメソッドになる。このとき、メソッドの第一引数(cls)はクラス自体となる。第一引数は、self でなく cls とする。

呼び出しは、クラス.メソッド(引数)とする。

次に示すコードは、クラス変数、クラスメソッドを使った例である。クラス変数である class_val は、クラス全体のインスタンスで同じ変数が共有されている。

class Python(): class_val = 1 def __init__(self, val): self.instance_val = val def instance_method(self): print(self.class_val, self.instance_val) @classmethod def class_method(cls): print(cls.class_val) # インスタンスメソッド 呼び出し p = Python(10) p.instance_method() # 1 10 # クラスメソッド 呼び出し Python.class_val # 1

スタティックメソッド

スタティックメソッドも、インスタンスを生成することなくアクセスできるが、インスタンス変数やクラス変数にはアクセスできない。スタティックメソッドを定義する場合は、@staticmethod デコレータを入れる。静的メソッドとも呼ばれる。このメソッドは、オブジェクトを作らずに実行可能である。

class A: @staticmethod def s(): print('static') @classmethod def c(cls): print('class') A.s() # static A.c() # class

Python おすすめ本

スポンサード リンク

Comments

Leave a Comment

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください