「きれいなpythonコードを書きたいな」と思いつつ、デコレータ(decorator)を使ってみることにしました。decorator が関数のラッパとしてどう働くかは数多の解説があります。
ここでは、getter/setterの関数の実装として使ってみます。単純に参照や代入をするとき、そこに自分独自の処理を含めた関数として実装したいときに使えます。
デコレータを使った変数の取得と設定の実装
単純に、整数値という制約をつけて書いてみました。
test.py
class Something(object):
def __init__(self):
self._param:int = 10
@property
def param(self) -> int:
if isinstance(self._param,int):
return self._param
else:
raise ValueError("not integer. {}".format(self._param.__class__.__name__))
@param.setter
def param(self, p_):
if isinstance(p_, int):
self._param = p_
else:
raise ValueError("not a integer. {}".format(p_.__class__.__name__))
try:
obj = Something()
print("[1]", obj.param)
obj.param = 200
print("[2]", obj.param)
obj.param = 1.23
print("[3]", obj.param)
except Exception as e:
print(e)
実行してみると、
$ python test.py
[1] 10
[2] 200
not a integer. float
エラーの使い方、これで良いのかな。入出力の型については、型を定義することで対応できるのかもしれないと思う。もっと他の場面で使えるのだと思う。典型例は何だろうか?
参考
下記のサイトを参考にしました。
本家本元の解説、どこかにあるのかな。
まとめ
とりあえず使ってきたいと思う。「ここでこそ」という典型的な使用例を知りたい。
(2021/05/24)