LoginSignup
1
1

More than 1 year has passed since last update.

【python】@propertyと@x.setter でデコレータ

Last updated at Posted at 2021-05-24

「きれいな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)

1
1
3

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
1
1