0Pricing
Python Academy · レッスン

@property デコレーター

getter、setter、deleter に property を使います。

「@property デコレーター」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

導入

@propertyはメソッドを読み取り可能な属性に変えます。@setterと@deleterを組み合わせることで、制御されたアクセスのパターンが完成します。

なぜ@ propertyを使うのですか

JavaのようにgetX()/setX()を使う代わりに、Pythonでは@propertyを使います。obj.get_value()ではなくobj.valueのように、属性としてアクセスできます。
class Circle:
    def __init__(self, r): self._r = r
    @property
    def radius(self): return self._r
c = Circle(5)
print(c.radius)  # no ()

計算プロパティ

@propertyメソッドは必要なときに計算されます。obj.areaはアクセスされるたびに計算され、値を保存しておく必要はありません。
import math
class Circle:
    def __init__(self, r): self._r = r
    @property
    def area(self): return math.pi * self._r**2
c = Circle(5)
print(round(c.area, 2))

プロパティのsetter

@property_name.setterを追加するとsetterを定義できます。これでc.radius = 10を実行すると、setterメソッドが呼び出されます。
class Circle:
    def __init__(self, r): self._r = r
    @property
    def radius(self): return self._r
    @radius.setter
    def radius(self, val):
        if val <= 0: raise ValueError('radius must be positive')
        self._r = val
c = Circle(5)
c.radius = 10
print(c.radius)

プロパティのdeleter

@property_name.deleterはdel obj.attrを処理します。後片付けの処理に使用します。
class User:
    def __init__(self, name): self._name = name
    @property
    def name(self): return self._name
    @name.deleter
    def name(self): del self._name
u = User('Alice')
del u.name
print(hasattr(u, '_name'))

読み取り専用プロパティ

getterだけを定義し、setterは定義しません。代入しようとするとAttributeErrorが発生します。
class Const:
    def __init__(self, v): self._v = v
    @property
    def value(self): return self._v
c = Const(42)
print(c.value)
try: c.value = 99
except AttributeError as e: print(e)

検証付きプロパティ

setterはデータを検証するのに最適な場所です。保存する前に、型、範囲、形式を確認できます。
class BoundedInt:
    def __init__(self, lo, hi): self.lo,self.hi=lo,hi; self._v=lo
    @property
    def value(self): return self._v
    @value.setter
    def value(self, v):
        if not self.lo <= v <= self.hi:
            raise ValueError(f'{v} out of [{self.lo},{self.hi}]')
        self._v = v
b = BoundedInt(0, 10)
b.value = 5
print(b.value)

propertyによるキャッシュ

@propertyとキャッシュした値を組み合わせると、1回だけ計算してメモ化できます。
class Expensive:
    _cache = None
    @property
    def result(self):
        if self._cache is None:
            self._cache = sum(range(1000))
        return self._cache
e = Expensive()
print(e.result)
print(e.result)

cached_property(Python 3.8以降)

@functools.cached_propertyはプロパティを1回だけ計算し、インスタンス属性として保存します。そのため、計算を繰り返す必要がありません。
from functools import cached_property
import math
class Circle:
    def __init__(self, r): self.r = r
    @cached_property
    def area(self): return math.pi * self.r**2
c = Circle(5)
print(round(c.area, 2))

propertyと__slots__

__slots__は任意の属性の作成を防ぎ、メモリを節約します。プロパティは処理を追加します。この2つは互いに補完し合います。
class Point:
    __slots__ = ('_x', '_y')
    def __init__(self, x, y): self._x,self._y=x,y
    @property
    def x(self): return self._x
p = Point(1, 2)
print(p.x)

@propertyを使う場面

次のような場合に@propertyを使います。データの検証が必要な場合、計算値を扱う場合、内部実装を変更しながら後方互換性を維持する場合です。
# Before: class Person:
#     def __init__(self, age): self.age = age
# After: add validation without changing caller code
class Person:
    def __init__(self, age): self.age = age
    @property
    def age(self): return self._age
    @age.setter
    def age(self, v):
        if v < 0: raise ValueError('negative age')
        self._age = v
p = Person(30)
print(p.age)

クイックチェック

setterを定義していない読み取り専用の@propertyに代入しようとすると、どうなりますか?

復習

@property:getterを属性アクセスに変えます。@name.setter:書き込みを可能にします。@name.deleter:delによる削除を可能にします。@cached_property:1回だけ計算します。setterは検証に使用します。

学習を続ける

素晴らしい進み具合です。次の概念を身につけるために、このまま学習を続けてください。

よくある質問

「@property デコレーター」レッスンは無料ですか?

はい。「@property デコレーター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「@property デコレーター」で何を学びますか?

getter、setter、deleter に property を使います。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「@property デコレーター」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 第一級オブジェクトとしての関数
  2. カスタムデコレーターの作成
  3. @property デコレーター
  4. @classmethod と @staticmethod
← Python Academyに戻る