auの日記

プログラミング初心者の日記。(auはハンドルネームです)

Pythonの@propertyについて調べてみた

auです。

特殊文字で検索に引っかからなそうですが、Pythonの関数の上についている「@property」について調べてみました。

property

Pythonのpropertyは、以下のようにして使われています。

class TestProparty():
    def __init__(self, n):
        self._n = n

    @property
    def get_n(self):
        return self._n

これは「デコレータ」と呼ばれており、property以外にも色々あります。

propertyの場合は、「読み取り専用の関数」として定義されます。「getter」専用の関数となるわけですね。


実際に使ってみます。

class TestProparty():
    def __init__(self, n):
        self._n = n

    @property
    def n(self):
        return self._n


instance = TestProparty(100)
print(instance.n) # 100
instance.n = 1000
# Traceback (most recent call last):
  File "test.py", line 16, in <module>
    instance.n = 1000
AttributeError: can't set attribute

nの値を書き換えようとしても、エラーで弾かれてしまいます。


明示的にsetterをつけることで、値の更新をすることができます。

class TestProparty():
    def __init__(self, v):
        self._n = v

    @property
    def n(self):
        return self._n

    @n.setter
    def n(self, v):
        self._n = v


instance = TestProparty(100)
print(instance.n)  # 100
instance.n = 1000
print(instance.n)  # 1000

今度はエラーなく書くことができました。

propertyの関数名.setter

を記述することでsetterを利用できるようになります。