Help us understand the problem. What is going on with this article?

python property

property

pythonで自分で定義したオブジェクトから値を取得したり更新したり削除したりしたい時の
動作を定義することができる機能

使ってみる

まずはpropertyを使わない場合

class NoProperty(object):
    def __init__(self, x):
        self._x = x

    def get_x(self):
        return self._x

    def set_x(self, v):
        self._x = abs(v)

    def del_x(self):
        self._x = None
実行結果
nopro = NoProperty(100)
print(nopro.get_x()) # 100

nopro.set_x(-200)
print(nopro.get_x()) # 200

nopro.del_x()
print(nopro.get_x()) # None

同じことをpropertyを使って表現

class MyProperty(object):
    def __init__(self, x):
        self._x = x

    @property # propertyの時は x.getterと同義
    def x(self):
        return self._x

    @x.setter
    def x(self, v):
        self._x = abs(v) # 更新前に何らかの処理をはさめる

    @x.deleter
    def x(self):
        self._x = None
実行結果
mypro = MyProperty(100)
print(mypro.x) # 100

mypro.x = -200
print(mypro.x) # 200

del mypro.x
print(mypro.x) # None

使わない場合と実行の仕方が違うことに注意

propertyを使って動作を制限

class MyProperty(object):
    def __init__(self, x):
        self._x = x

    @property
    def x(self):
        return self._x
実行結果
mypro = MyProperty(100)
print(mypro.x) # 100

mypro.x = -200
AttributeError # 定義されていないのでエラー

読み取り専用として使いたい時などに便利

Sylba2050
Qiitaはメモ帳 コメント欄は見ていません 編集リクエストは確認します
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away