Menu
CoddyTech

プロパティデコレータ

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

重要なポイント: プロパティデコレーターを使うと、メソッドを属性のように扱えます。ゲッターには@propertyを、セッターには@attribute_name.setterを使用します。これにより、シンプルな属性アクセスの構文を保ちながら、データの検証や計算値の取得ができます。

challenge icon

チャレンジ

中級

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

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

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ