プロパティとは?
簡単に言うと「インスタンスメソッド」を「インスタンス変数」のように扱える機能のことです。
プロパティは以下のような要望に答えられます。

他のインスタンス変数から求められる値を使いたい!

インスタンス変数に代入される値をチェックしたい!
プロパティの解説をする前提として、pythonのクラスの知識が必要になります。
クラスについてよくわからない方はこちらの記事を先に読んでみてください👇
プロパティを具体例で使ってみる
今回はこちらのコードを例に解説します。
class Store: def __init__(self, raw_price): self.raw_price = raw_price self._discounts = 0 #値引き値の初期設定 @property def discounts(self): return self._discounts @discounts.setter def discounts(self, value): if value < 0 or 100 < value: raise ValueError('0 <= value <= 100') self._discounts = value @property def price(self): return int(self.raw_price * (100 - self._discounts)/100)
まずはインスタンス「pen」を作ります。
pen = Store(90) #penの値段は90
まだdiscountsを設定していないので初期値の0が出力されます。
pen.discounts #discountsというインスタンス変数を参照 #【出力】 # 0
もちろんまだ割り引きしていないので値段はそのまま90です。
pen.price #【出力】 # 90
ここで注目して欲しい点があります!
「price」はメソッドなのにもかかわらず、「price()」と括弧を付けなくても参照できている!
これがプロパティの特徴です!
メソッドがまるでインスタンス変数のようですよね。簡単に参照できます。
ここで値引き値(discounts)を設定してみます。
pen.discounts = 50
その後、再びメソッドpriceの結果を見てみると
pen.price #プロパティゆえ、「price()」と括弧を付けずに呼び出せる #【出力】 # 45
割引が反映された値段になっています。
discountsというインスタンスメソッドに関しても、「@property」をつけて定義したので、 インスタンス変数のようにアクセスできます。
もちろん「discounts()」と括弧を付ける必要もありません。
pen.discounts #【出力】 # 50
@discounts.setterについて
「pen.discounts = 50」のように値を代入するときに呼ばれます。
この”@discounts.setter”を用意することで、不正なdiscountsの代入をはじいてくれます。
ちなみに、インスタンスメソッド”discounts”に対するsetterだから、”@discounts.setter”という名前です。
上のサンプルコードについては、プロパティのおかげで
のメリットが得られました。
〜参考書籍〜
こちらの本を参考にしました👇