Menu
Coddy logo textTech

プロパティデコレータ

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 は値がどのように代入されるかを制御できるようにするため、データのバリデーション(検証)やカプセル化が可能になります。

自分で試してみよう

このレッスンにはコードチャレンジは含まれていません。

quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Object Oriented Programmingのすべてのレッスン