クラス変数とインスタンス変数
クラス変数:
クラス変数とは、クラスを作ったのとき、クラスの名の下に宣言された変数はクラス変数と見なされます。
class Sample1:
name = 'name'
print(Sample1.name) #name
Sample1.name = 'changed_name'
print(Sample1.name) #changed_name
インスタンス変数
class Sample2:
def __init__(self, value):
self.value = value
s1 = Sample2('AAA')
s2 = Sample2('BBB')
print(s1.value) # AAA
print(s2.value) # BBB
s1.value = 'CCC'
print(s1.value) # CCC
print(s2.value) # BBB
オブジェクトs1が参考している値を変更しても、s2の値には全然影響がありません。
クラス関数
クラス変数があるように、クラス関数もあります。
class TaxCalc:
@classmethod
def class_method(cls, price):
assert cls.__name__ == TaxCalc.__name__
return int(price * 0.08)
@staticmethod
def static_method(price):
return int(price * 0.08)
print(TaxCalc.class_method(1000))
print(TaxCalc.static_method(1000))
インスタンス関数との区別をつけるため、関数の頭に@classmethodをつけることになっています。クラスメソッドはメソッドのselfと同じで、第1引数に自動的に自身のクラスが格納されます。
classmethod
:クラスメソッド
staticmethode
:スタティックメソッド
特に:
クラスの情報が必要な場合は、@classmethodを使います。
派生クラスでオーバーライドする場合も、@classmethodを使います。