例として以下のクラスを定義する。
example.py
class Example:
def __init__(self) -> None:
self.num: int = 0
加算・演算代入演算子を利用する際も、属性に定義されているsetterが呼びだされる。
これを利用して振る舞いを定義できる。
プロパティを用いて書き直すと
example.py
class Example:
def __init__(self) -> None:
self.__num: int = 0
@property
def num(self):
return self.__num
@num.setter
def num(self, value):
self.__num = value
self.__numに対して演算した際の、setterの様子を見てみる。
example.py
example = Example()
example.num = 2
example.num += 1
examaple.num = 2
の場合、setterの引数value
には、右辺の2
が入る。
example_num += 1
の場合、setterの引数value
には、計算後の値(ここでは3
)が入る。
もちろんself.__num
の値はsetterのself.__num = value
の行で代入されるまでは計算前の値になっている。
これを利用して、valueを代入する前のself.__numの値とvalueの値を比較することで、
加算・減算代入を場合分けして振る舞いを定義できる。
example.py
@num.setter
def num(self, value):
if value < self.__num: # 成立するのは加算代入をしている場合。ただし通常の代入でも成り立つ可能性はある
pass # += のときの振る舞い
elif value > self.__num: # 成立するのは減算代入をしている場合。ただし通常の代入でも成り立つ可能性はある
pass # -= のときの振る舞い
self.__num = value