プロパティデコレータ
CoddyのPythonジャーニー「Object Oriented Programming」セクションの一部 — レッスン 10/64。
@property デコレータを使用すると、メソッドに属性のようにアクセスできるようになり、値の取得(get)や設定(set)をスマートに行う方法が提供されます。これはカプセル化に役立ち、クラスのパブリックインターフェースを変更することなく、バリデーションロジックや計算された値を追加することができます。
以下は、@property を使用した class の例です:
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@property
def area(self):
return 3.14159 * self._radius ** 2実際の値を保存するために self._radius を使用していることに注意してください。getter 内で self.radius を使用すると、再び getter メソッドが呼び出され、無限再帰が発生してしまいます。
円を作成してプロパティにアクセスします:
my_circle = Circle(5)通常の属性と同じようにプロパティにアクセスします:
print(my_circle.radius)
print(my_circle.area)出力:
5
78.53975プロパティにアクセスする際はカッコ () を使用しないことに注意してください。属性のように見えますが、メソッドのコードが実行されます。
バリデーションを行って値を変更できるように setter を追加します:
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value > 0:
self._radius = value
else:
print("Radius must be positive!")これで、属性のように radius を設定できるようになります。
my_circle = Circle(5)
my_circle.radius = 10 # Uses the setter
print(my_circle.radius) # Uses the getter出力結果:
10重要ポイント: @property はメソッドを属性のように見せかけることができ、@property_name.setter は値がどのように代入されるかを制御できるようにするため、データのバリデーション(検証)やカプセル化が可能になります。
自分で試してみよう
このレッスンにはコードチャレンジは含まれていません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。