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