Python のプロパティデコレータ

Manav Narula 2023年6月21日
  1. Python のプロパティ
  2. Python で@property デコレータを使用する
Python のプロパティデコレータ

クラスを作成し、Python でさまざまなデータメンバーと関数を定義できます。すべてがオブジェクトであり、独自に定義したクラスのオブジェクトをインスタンス化できます。

このチュートリアルでは、Python プロパティデコレータ(@property)の使用方法を示します。

Python のプロパティ

Python の getter 関数と setter 関数を使用して、非公開のクラス属性を返す場合があります。

この属性を返すクラス内に、getter 関数という関数を作成します。

このような属性の値を設定できる関数は、セッター関数と呼ばれます。

例:

class A:
    def __init__(self, a):
        self._a = a

    def getter_a(self):
        return self._a

    def setter_a(self, val):
        self._a = val


n = A(5)
print(n.getter_a())
n.setter_a(10)
print(n.getter_a())

出力:

5
10

上記の例では、a の属性値を返したり変更したりする getter 関数と setter 関数を作成しました。

このメソッドは、属性を処理する Python の方法とは見なされません。getter メソッドと setter メソッドを使用してクラスをクラスター化する必要をなくすことができます。

Python のアプローチでは、特定のクラス属性の機能を確立できるプロパティを使用します。

property() 関数を使用して、property クラスのオブジェクトを作成します。getter、setter、および deleter メソッドをデータメンバーのプロパティとしてアタッチします。

このために、プロパティ関数内で fgetfsetfdel、および doc 引数を使用します。

fget に関連付けられた関数は、属性の値を返します。同様に、fset メソッドは属性の値を変更し、fdel 関数は値を削除します。

doc メソッドは、特定の属性のドキュメントを提供します。

これらを以下のコードで使用します。

class A:
    def __init__(self, a):
        self._a = a

    def get_a(self):
        return self._a

    def set_a(self, val):
        self._a = val

    def del_a(self):
        del self._a
        print("Deleted")

    a = property(fget=get_a, fset=set_a, fdel=del_a, doc="Documenttion for a")


n = A(5)
print(n.a)
n.a = 10
print(n.a)
del n.a
print(n.a)

出力:

5
10
Deleted
Traceback (most recent call last):
  File "<string>", line 21, in <module>
File "<string>", line 6, in get_a
AttributeError: 'A' object has no attribute '_a'

上記の例では、クラスのプロパティ a を作成し、必要なプロパティを追加しました。ご覧のとおり、deleted プロパティを使用すると、属性が削除されたことを示す AttributeError が表示されます。

Python で@property デコレータを使用する

デコレータは、関数に機能を追加するために Python で使用されます。関数が引数として扱われ、別の関数が返されます。

Python でデコレータを導入した後、プロパティを設定するための property() 関数の使用がなくなり、同じデコレータ構文が優先されました。

デコレータは Pythonv2.4 で導入されました。 @property デコレータは、プロパティを作成するために人気がありました。

以下の前の例では、@property デコレータを使用します。

class A:
    def __init__(self, a):
        self._a = a

    @property
    def a(self):
        return self._a

    @a.setter
    def a(self, val):
        self._a = val

    @a.deleter
    def a(self):
        del self._a
        print("Deleted")


n = A(5)
print(n.a)
n.a = 10
print(n.a)
del n.a
print(n.a)

出力:

5
10
Deleted
Traceback (most recent call last):
  File "<string>", line 23, in <module>
File "<string>", line 7, in a
AttributeError: 'A' object has no attribute '_a'

ご覧のとおり、前の例と同じ出力が得られました。このメソッドは、property() 関数よりも比較的簡単に使用できます。

@property デコレータでは、属性をプロパティ名として返す関数を使用します。その後、@<property-name>.setter@<property-name>.deleter が setter メソッドと deleter メソッドを追加します。

著者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

関連記事 - Python Property