Menu
Coddy logo textTech

プロパティデコレータ

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 を使用します。これにより、シンプルな属性アクセス構文を維持しながら、データのバリデーションや計算された値を利用できるようになります。

challenge icon

チャレンジ

中級

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: 以前と同じ形式を使用する
quiz icon腕試し

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

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