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

クラス変数やクラスメソッドは、クラスオブジェクトの属性なので、インスタンスを生成することなくアクセスできる。スタティックメソッドも、インスタンスを生成することなくアクセスできるが、インスタンス変数やクラス変数にはアクセスできない。
エンジニア速報は Twitter の@commteで配信しています。
目次
ポイント
クラスメソッドの特徴
- 処理を追加する機能を持つ
- クラス全体に影響を与える
- インスタンス変数にはアクセスできない
- インスタンス生成せずにアクセス可能
- @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 おすすめ本
スポンサード リンク
Leave a Comment