プロパティと属性の違い、setter/getterを使う理由
クラスやオブジェクトに直接結びつくデータ(変数)のこと。
例えば、obj.x の x が属性。
直接アクセスできるため、書き換えや参照が簡単。
class Sample :
def __init__ (self ):
self .x = 10 # 属性
obj = Sample ()
print (obj .x ) # 10
obj .x = 20
print (obj .x ) # 20
属性の値にアクセスするときの「処理(getter/setter)」をカプセル化したもの。
直接アクセスはできるが、アクセス時に自動でメソッドが呼ばれる。
Pythonでは @property デコレータで実装する。
class Sample :
def __init__ (self ):
self ._x = 10 # 実際の値は「_x」に格納
@property
def x (self ):
print ("getterが呼ばれた" )
return self ._x
@x .setter
def x (self , value ):
print ("setterが呼ばれた" )
if value < 0 :
raise ValueError ("xは0以上でなければならない" )
self ._x = value
obj = Sample ()
print (obj .x ) # getterが呼ばれた -> 10
obj .x = 20 # setterが呼ばれた
print (obj .x ) # getterが呼ばれた -> 20
3. なぜsetter/getter(プロパティ)を使うのか?
直接属性にアクセスすると不正な値も入ってしまう可能性がある。
setterを使えば値の範囲チェックや型チェックができる。
3-2. 後から実装を変更してもコードの利用側に影響を与えない
最初は単純な属性でも、後でgetter/setterを追加したくなることがある。
プロパティを使っておけば、コードを使う側はアクセス方法を変えずに済む。
属性の読み書き時に処理を追加できる(例:ログ出力、キャッシュ更新など)。
3-4. カプセル化・オブジェクト指向設計に適している
内部実装を隠してインターフェースだけ公開することで、設計がきれいになる。