プログラミングは誰かが適当に決めたことを覚えて守って書かなくてはならない
@property @setter
これらは、ある程度大きなプロジェクト等では必要になる配慮で、かつそれを簡略化したスキーム的なことで、早い安い美味いということらしい。
del instance._** で @**.deleterが呼ばれる? 直感的でないのでクソですね。廃止内定。
WEBで見つけたソースを勝手に日本語にしました
from datetime import datetime
from pprint import pprint
価格_変更_logs = [] # 価格変更を記録する
異常_logs = [] # 異常な価格変更を記録する
class ミネラルウォーター:
def __init__(self, 商品名, 定価=0):
self.商品名 = 商品名
self._価格 = 定価
# _価格のgetter
@property
def 価格(self):
return self._価格
# _価格のおまけgetterr
@property
def 特売_価格(self):
return f'{self._価格*0.8:.2f}'
# _価格のおまけgetterr
@property
def 処分_価格(self):
return f'{self._価格*0.5:.2f}'
# _価格のsetter
@価格.setter
def 価格(self, new_value):
time_str = datetime.now().strftime("%Y/%m/%d, %H:%M:%S")
価格_変更_logs.append({time_str: new_value})
if new_value > 1000:
log_str = f'異常検出: 範囲外の価格が設定されました-> {new_value}!'
異常_logs.append({time_str: log_str})
self._価格 = new_value
# _価格のdeleter
@価格.deleter
def 価格(self):
time_str = datetime.now().strftime("%Y/%m/%d, %H:%M:%S")
log_str = f'特殊操作: 価格が抹消されました!'
異常_logs.append({time_str: log_str})
# インスタンス化
ペットボトル水 = ミネラルウォーター('富士の雨水', 200)
print(ペットボトル水.商品名,ペットボトル水.価格)
#富士の雨水 200
# change the 価格
ペットボトル水.価格 = 130
ペットボトル水.価格 = 150
ペットボトル水.価格 = 190
ペットボトル水.価格 = 1050
ペットボトル水.価格 = 120
ペットボトル水.価格 = 110
print(ペットボトル水.商品名)
## 富士の雨水
print(ペットボトル水.商品名,ペットボトル水.価格)
## 富士の雨水 110
print('特売_価格',ペットボトル水.特売_価格)
## 特売_価格 88.00
print('処分_価格',ペットボトル水.処分_価格)
## 処分_価格 55.00
#delete the 価格
del ペットボトル水.価格
# show the log
pprint(価格_変更_logs)
# [{'2022/01/01, 08:29:05': 130},
# {'2022/01/01, 08:29:09': 150},
# {'2022/01/01, 08:29:11': 190},
# {'2022/01/01, 08:29:13': 1050},
# {'2022/01/01, 08:29:16': 120},
# {'2022/01/01, 08:29:18': 110}]
pprint(異常_logs)
# [{'2022/01/01, 08:29:13': '異常検出: 範囲外の価格が設定されました-> 1050!'},
# {'2022/01/01, 08:29:28': '特殊操作: 価格が抹消されました!'}]
# 参考記事
# https://ichi.pro/python-de-puropathidekore-ta-o-wazawaza-shiyosuru-no-wa-naze-desu-ka-162024459831021
##4つの利点
##大規模なプロジェクトでは、プロパティデコレータを使用すると、①特定の属性を取得および②設定する際の柔軟性が大幅に向上します。
##③無関係なAPIを他のモジュールに公開することなく、さまざまな操作をカプセル化できます。
##④データをタイムリーにデバッグおよび監視できるようにする重要なイベントをログに記録できることです。
##
##ノータッチの宣言として_プレフィックスとしてアンダースコアを使用します。
##これは、この属性が「プライベート」であることを示します
##ゲッターセッターを実装することで、通常の属性と同じようにプロパティにアクセス、更新、削除できます
##プロパティデコレータを使用する最初の利点は、プロパティが設定されたときにデータを検証できることです
##この例では、設定する価格が有効な正の数であるかどうかを確認することが重要です。
##また、価格の上限を設定する必要があります
##プロジェクトの範囲が拡大すると、他の多くのモジュールがこのカスタムクラスの使用を開始します。
##プロジェクト内の複数の場所が同じオブジェクトにアクセスして更新できる可能性があります。
##これにより、不整合やバグが発生する可能性があります。
##したがって、オブジェクトの特定の属性がその存続期間中にどのように変更されるかを確認すると役立つ場合があります
##getterメソッドとsetterメソッドがないと、何が起こったのかを正確に知ることは簡単ではありません。
##プロパティデコレータを実装すると、これらの更新レコードをログに記録する機会が生まれます。
##これは、デバッグやデータ監視の目的に役立ちます。
Jupyter形式で実行
from datetime import datetime from pprint import pprint
In [ ]:
価格_変更_logs = [] 異常_logs = []
In [ ]:
class ミネラルウォータークラス: def __init__(self, 商品名, 定価=0): self.商品名 = 商品名 self._価格 = 定価 # _価格のgetter @property def 価格(self): return self._価格 # _価格のおまけgetterr @property def 特売_価格(self): return f'{self._価格*0.8:.2f}' # _価格のおまけgetterr @property def 処分_価格(self): return f'{self._価格*0.5:.2f}' # _価格のsetter @価格.setter def 価格(self, new_value): time_str = datetime.now().strftime("%Y/%m/%d, %H:%M:%S") # 価格が変更される都度LOGに書き込まれる 価格_変更_logs.append({time_str: new_value}) if new_value > 1000: # 1000円以上の場合エラーログに記録される log_str = f'異常検出: 範囲外の価格が設定されました-> {new_value}!' 異常_logs.append({time_str: log_str}) self._価格 = new_value # _価格のdeleter @価格.deleter def 価格(self): time_str = datetime.now().strftime("%Y/%m/%d, %H:%M:%S") # 価格情報が抹消されたらエラーログに書き込む log_str = f'特殊操作: 価格が抹消されました!' 異常_logs.append({time_str: log_str})
In [ ]:
# インスタンス化 ペットボトル水 = ミネラルウォータークラス('富士の雨水', 200)
change the 価格
In [ ]:
ペットボトル水.価格 = 130 ペットボトル水.価格
Out[ ]:
130
In [ ]:
ペットボトル水.価格
Out[ ]:
130
In [ ]:
ペットボトル水.価格 = 150 ペットボトル水.価格
Out[ ]:
150
In [ ]:
ペットボトル水.価格 = 190 ペットボトル水.価格
Out[ ]:
190
In [ ]:
ペットボトル水.価格 = 1050 ペットボトル水.価格
Out[ ]:
1050
In [ ]:
ペットボトル水.価格 = 120 ペットボトル水.価格
Out[ ]:
120
In [ ]:
ペットボトル水.価格 = 110 ペットボトル水.価格
Out[ ]:
110
In [ ]:
ペットボトル水.商品名
Out[ ]:
'富士の雨水'
In [ ]:
ペットボトル水.商品名,ペットボトル水.価格
Out[ ]:
('富士の雨水', 110)
In [ ]:
'特売_価格',ペットボトル水.特売_価格
Out[ ]:
('特売_価格', '88.00')
In [ ]:
'処分_価格',ペットボトル水.処分_価格
Out[ ]:
('処分_価格', '55.00')
In [ ]:
#delete the 価格 del ペットボトル水.価格
show the log
In [ ]:
価格_変更_logs
Out[ ]:
[{'10/14/2021, 20:55:15': 130}, {'10/14/2021, 20:55:15': 150}, {'10/14/2021, 20:55:15': 190}, {'10/14/2021, 20:55:15': 1050}, {'10/14/2021, 20:55:15': 120}, {'10/14/2021, 20:55:15': 110}]
In [ ]:
異常_logs
Out[ ]:
[{'10/14/2021, 20:55:15': '異常検出: 範囲外の価格が設定されました-> 1050!'}, {'10/14/2021, 20:55:15': '特殊操作: 価格が抹消されました!'}]
コメント