プロパティデコレータ
CoddyのPythonジャーニー「Object Oriented Programming」セクションの一部 — レッスン 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重要なポイント: プロパティデコレータは、メソッドを属性のように見せます。ゲッターには @property を、セッターには @attribute_name.setter を使用します。これにより、シンプルな属性アクセス構文を維持しながら、データのバリデーションや計算された値を利用できるようになります。
チャレンジ
中級temperature.py内の摂氏と華氏を変換するTemperatureクラスを完成させてください。次に、温度変換をテストするために、driver.pyでこのクラスを使用してください。ステップバイステップの指示については、両方のファイルのTODOコメントに従ってください。
チートシート
プロパティデコレータを使用すると、シンプルな属性構文を維持しながら、属性へのアクセスや変更方法を制御できます。
ゲッターメソッドには @property を使用します:
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) # 属性のようにアクセスし、括弧は不要バリデーション(検証)を伴うセッターメソッドには @attribute_name.setter を使用します:
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 # バリデーション付きのセッターを使用値を計算する算出プロパティを作成します:
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 を計算自分で試してみよう
# TODO: temperatureモジュールからTemperatureクラスをインポートする
# クラスをテストする:
# TODO: 25°Cで温度のインスタンスを作成する
temp = None # 実際のTemperatureインスタンスに置き換える
# TODO: 摂氏と華氏の両方の値を出力する
# TODO: 次の形式を使用する: "25.0°C is 77.0°F"
# TODO: 温度を98.6°Fに設定する
# TODO: 変換が機能することを確認するために、両方の値を再度出力する
# TODO: 以前と同じ形式を使用するこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。