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 メソッドをデータメンバーのプロパティとしてアタッチします。
このために、プロパティ関数内で fget
、fset
、fdel
、および 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 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