📗
Pythonでclassを使う: 設計編(3) propertyでメンバーの定義
はじめに
本記事ではメンバーの定義におけるproperty
の説明をします。
基本的に趣味や学部の研究レベルでは、通常のメンバーの定義で事足ります。
通常のメンバー定義やその意義については以下の記事で解説しています。
property
はプログラムの堅牢化やバリデーションで用いられる他、世の中のプログラムで広く使われているため、理解は必須です。
property
とは
クラスのメンバーで変数のように参照することのできる関数のことをプロパティといいます。
もっともわかりやすい使用例は以下です。
class X:
def __init__(self):
self.x = 1
@property
def times(self):
return self.x*2
x = X()
print(x.times) #変数として参照できる
property
の実例(getterとsetter)
外部から直接参照すべきではない隠蔽したメンバーの値を関数の返り値として定義することで、外部から呼び出す(getter
)ことができます。
また隠蔽したメンバーの値を変更するときは、{変数}.setter
デコレータを用いることで変更できます。
class A:
def __init__(self, x):
self._x = x # 隠蔽したメンバー
@property
def x(self):
return self._x
@x.setter
def x(self,x):
self._x = x
またsetter
の定義の際に値のバリデーションを行うことができます。
例えば以下ではx
が負の値を取ったときにエラーを送出します。
class A:
def __init__(self, x):
self._x = x # 隠蔽したメンバー
@property
def x(self):
return self._x
@x.setter
def x(self,x):
if x < 0:
raise ValueError("X cannot be negative.")
self._x = x
バリデーションの他手法
他にもDescriptors
やattr
を用いる方法などが紹介されています[1]。
クラス内にバリデーション用の関数を作る手法なども紹介されていますが、非推奨なのでご注意を。
[1] https://towardsdatascience.com/6-approaches-to-validate-class-attributes-in-python-b51cffb8c4ea
Discussion