2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

クラスの属性に対する加算・減算代入演算子(+=, -=)の振る舞いを定義したいとき

Last updated at Posted at 2021-07-31

例として以下のクラスを定義する。

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
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?