classmethod
クラスメソッドは、インスタンスメソッドが暗黙の第一引数としてインスタンスをとるように、第一引数としてクラスをとります。
(クラス自身が暗黙的に第一引数として挿入される)
クラスメソッドの宣言は下記になります。
class Sample:
@classmethod
def func(cls, arg1, arg2, ...): ...
2行目の「classmethod」をデコレータとして置きます。
3行目の関数「func」の第1パラメータがクラスになります。
例1
class Sample(object):
@classmethod
def func(*args):
print(*args)
Sample.func("abc")
'''
第1引数には必ずクラスオブジェクトがくる
表示 <class '__main__.Sample'> abc
'''
インスタンスメソッドの場合も暗黙的に第一引数にインスタンスが挿入され、第一引数を self とするのがきまりとなっているように classmethod を使う場合もそれと同じように、第一引数を「cls」とすることがルールとなっています(他の名前をつけても文法的なエラーで出ません)。
例2
class Sample(object):
@classmethod
def func(cls, a):
print(a + ' sam')
Sample.func("abc")
#表示
#abc sam
インスタンス変数にはインスタンスメソッドからしかアクセスできません。
クラスメソッドの第1引数にselfを書いてもクラス変数を参照しようとするだけで、インスタンス変数は参照しません。
class Sam(object):
name1 = "山田"
name2 = "太郎"
def __init__(self, a=10):
#インスタンス変数
self.a = a
#インスタンスメソッド
def get_name_ins(self):
return self.a
#クラスメソッド
@classmethod
def get_name_cls(cls):
#def get_name_cls(self):
return cls.name1
#return self.a エラー
a = Sam()
print(a.get_name_ins())
print(a.get_name_cls())
#表示
#10
#山田
staticmethod
スタティックメソッドはクラスメソッドの第二引数以下だけの場合と同じです。
第1引数に「self」や「cls」は渡されません。
class Sam(object):
name1 = "山田"
name2 = "太郎"
def __init__(self, a=10):
#インスタンス変数
self.a = a
#スタディックメソッド
@staticmethod
def get_name_sta(arg):
return Sam.name1 + arg
a = Sam()
print(a.get_name_sta('孝之'))
#表示
#山田孝之
クラス変数へのアクセス
インスタンスメソッド、クラスメソッド、スタティックメソッドとすべてのメソッドでクラス変数にアクセスできます。
class Sam(object):
name1 = "山田"
name2 = "太郎"
def __init__(self, a=10):
#インスタンス変数
self.a = a
#インスタンスメソッド
def get_name_ins(self):
return Sam.name1
#クラスメソッド
@classmethod
def get_name_cls(cls):
return Sam.name1
#スタディックメソッド
@staticmethod
def get_name_sta():
return Sam.name1
a = Sam()
print(a.get_name_ins())
print(a.get_name_cls())
print(a.get_name_sta())
#表示
#山田
#山田
#山田