📗

Pythonでclassを使う: 設計編(3) propertyでメンバーの定義

2023/04/03に公開

はじめに

本記事ではメンバーの定義におけるpropertyの説明をします。

基本的に趣味や学部の研究レベルでは、通常のメンバーの定義で事足ります。

通常のメンバー定義やその意義については以下の記事で解説しています。

https://zenn.dev/sergicalsix/articles/2c7832353b6afa

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

バリデーションの他手法

他にもDescriptorsattrを用いる方法などが紹介されています[1]。
クラス内にバリデーション用の関数を作る手法なども紹介されていますが、非推奨なのでご注意を。

[1] https://towardsdatascience.com/6-approaches-to-validate-class-attributes-in-python-b51cffb8c4ea

Discussion