プロパティデコレータ
CoddyのPythonジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 14/64。
プロパティデコレーターを使うと、シンプルな属性構文を保ちながら、属性へのアクセス方法や変更方法を制御できます。
プロパティゲッターを持つクラスの例を示します。
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def age(self):
return self._ageこのプロパティを通常の属性のように使います:
person = Person("Alice", 30)
print(person.age)出力:
30実際にはメソッドを呼び出していますが、ageには括弧を付けずにアクセスしていることに注目してください。
値を設定するときにデータを検証するセッターを追加します。
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if value < 0:
raise ValueError("Age cannot be negative")
self._age = valueこれで、自動検証を使って年齢を設定できます。
person = Person("Alice", 30)
person.age = 31 # 検証機能付きのセッターを使用
print(person.age) # ゲッターを使用
# これはエラーを発生させます:
# person.age = -5 # ValueError: 年齢は負の値にできません出力:
31値を計算する計算プロパティを作成します。
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
rect = Rectangle(5, 3)
print(rect.area) # 5 * 3 = 15 を計算する出力:
15重要なポイント:プロパティデコレーターを使うと、メソッドを属性のように扱えます。getter には @property を、setter には @attribute_name.setter を使います。これにより、属性に簡単にアクセスできる構文を保ちながら、データの検証や計算値の処理ができます。
チャレンジ
中級temperature.py の Temperature クラスを完成させ、摂氏と華氏の間で変換できるようにしてください。次に、このクラスを driver.py で使って、温度変換をテストしてください。両方のファイルにある TODO コメントに従って、手順を進めてください。
各変換を [celsius]°C is [fahrenheit]°F の形式で出力してください。摂氏の値は与えられたとおりにし、華氏の値は Python が計算したとおりにしてください。数値を丸めたり、書式を設定したりしないでください。driver が出力する2行は次のとおりです。
25°C is 77.0°F
37.0°C is 98.6°F自分で試してみよう
# TODO: temperature モジュールから Temperature クラスをインポートする
# クラスをテストする:
# TODO: 25°C の温度インスタンスを作成する
temp = None # 実際の Temperature インスタンスに置き換える
# TODO: 摂氏と華氏の値を両方出力する
# TODO: 次の形式を使用する: "25°C is 77.0°F"(両方の値を丸めたり書式を変更したりせず、そのまま出力する)
# TODO: 温度を 98.6°F に設定する
# TODO: 変換が正しく機能することを確認するため、両方の値をもう一度出力する
# TODO: 前と同じ形式を使用するこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ