Pythonの @property
デコレータについて学んだので、初心者としての視点でまとめてみます。
プロパティは「関数のような属性」といったイメージで、見た目は属性アクセスなのに、裏では関数が動いているという仕組みです。
つまり、「色々な処理をしたうえで、その最終的な値を属性のように呼び出したいときに property
を使います」
プロパティとは?
プロパティとは、クラスの中で「値を使うとき・設定するとき・削除するとき」に、自動的に関数を実行できる仕組みです。
通常の変数アクセスのように書けるのに、裏では関数が呼び出されて、値のチェックや計算などができます。
基本の構文(getter/setter/deleter)
プロパティは次の3つの要素から成り立ちます:
-
@property
:値を取得する関数(getter) -
@xxx.setter
:値を設定する関数(setter) -
@xxx.deleter
:値を削除する関数(deleter)
それぞれの xxx には、最初に
@property
を付けた関数名を使います。
実例:Personクラスで使ってみる
class Person:
def __init__(self, name):
self._name = name # 内部変数は _ をつけるのが慣習
@property
def name(self): # getter
print("名前を取得します")
return self._name
@name.setter
def name(self, value): # setter
print("名前を設定します")
if not value:
raise ValueError("名前を空にはできません")
self._name = value
@name.deleter
def name(self): # deleter
print("名前を削除します")
del self._name
実行例
p = Person("Taro")
print(p.name) # getterが呼ばれる
p.name = "Jiro" # setterが呼ばれる
del p.name # deleterが呼ばれる
名前を取得します
Taro
名前を設定します
名前を削除します
読み取り専用にしたい場合(getterだけ)
プロパティは、getterだけ定義すれば読み取り専用にもできます。
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def area(self):
return 3.14 * self.radius ** 2
c = Circle(5)
print(c.area) # OK(getterが呼ばれる)
c.area = 100 # エラー!setterが定義されていない
property() 関数を使う方法
デコレータを使わずに property()
関数で定義する方法もあります。
class Person:
def __init__(self, name):
self._name = name
def get_name(self):
return self._name
def set_name(self, value):
self._name = value
def del_name(self):
del self._name
name = property(get_name, set_name, del_name)
この方法でも p.name
のように使えます。
@xxx.setter/@xxx.deleter の補足
✅ 重要ルール:
-
@property
で定義した関数名がname
なら、-
@name.setter
や@name.deleter
に必ず揃える必要があります
-
- 関数名が一致していないとエラーになります
いつ使うの?
プロパティは以下のような場面で使えます:
やりたいこと | プロパティの使い方 |
---|---|
値をチェックしてから代入したい | setter を使う |
値を自動で計算したい | getter を使う |
読み取り専用にしたい | getter だけ定義 |
値を削除するときにログを残したい | deleter を使う |
まとめ
-
@property
を使うと、関数なのに属性のようにアクセスできる - getter/setter/deleter を組み合わせて、値の取得・設定・削除を制御できる
- 属性のように見えて、裏では関数が動いている
- 初心者にも分かりやすい構文で、安全なデータ管理ができる
今回はプロパティの基本について、自分の理解を整理するためにまとめてみました。
実際のコードでも使いながら、もっと自然に使えるようにしていきたいです。