問題一覧に戻る
上級高度なパターン
問題109: ディスクリプタ
ディスクリプタは、__get__、__set__、__delete__メソッドを実装することで、属性アクセスをカスタマイズする仕組みです。クラス属性として定義され、インスタンスの属性アクセス時に自動的に呼ばれます。プロパティの検証やキャッシュなど、高度な属性管理に使用されます。
# ディスクリプタ
class Positive:
def __init__(self, name):
self.name = name
def (self, instance, owner):
return instance.__dict__.get(self.name, 0)
def (self, instance, value):
if value < 0:
raise ValueError("Must be positive")
instance.__dict__[self.name] = value
# ディスクリプタを使用
class Account:
balance = Positive('balance')
def __init__(self, initial):
self. = initial
# ディスクリプタをテスト
acc = Account(100)
print(acc.balance)
acc.balance = 200
print(acc.balance)