The AI / news

Pythonのディスクリプタと制御属性:オブジェクトの管理を強化する方法

Pythonのディスクリプタと制御属性:オブジェクトの管理を強化する方法
1 min de lecture

Pythonのディスクリプタは、オブジェクト属性の読み取り、変更、削除時の挙動を制御できます。チュートリアルでは、これを活用して3種類の制御属性(検証済み、計算済み、オンデマンド読み込み)を構築する方法を詳説。架空の日本観光アプリケーション例を用いて手法を説明しています。

ディスクリプタは、__get__、__set__、__delete__などのメソッドを実装し、属性の振る舞いを定義するクラスです。全てが必須ではありません。Python 3.6で導入された__set_name__メソッドは、ディスクリプタに割り当てられた属性名を通知し、親オブジェクトの__dict__に名前衝突なしで値を格納できるようにします。著者によれば、このアプローチは@propertyデコレータやgetter/setterによるコードの肥大化を防ぎます。

検証済み、計算済み、遅延読み込みの属性

最初の例であるValidatedRatingは、評価が最小値と最大値の間の数値(整数または小数)であることを確認します。デフォルトは1.0から5.0です。数値以外の値にはTypeErrorを、範囲外の値にはValueErrorを発生させます。

2つ目のComputedUSDPriceは、日本円(JPY)で保存された価格を米ドルで表示するために使用されます。コード内で近似値として示されている為替レート0.0067を用いて、その場で換算を計算します。この属性は読み取り専用であり、書き込み試行時にはAttributeErrorが発生します。

3つ目のLazyItineraryは、大容量JSONファイルの読み込みや日本の高速鉄道・新幹線の時刻表データベース照会など、生成コストが高いデータに適用されます。ディスクリプタは初回参照時のみ値を計算し、インスタンスの__dict__に格納した後、自身を削除します。以降の参照ではこの値を直接読み取ります。例では1秒の遅延シミュレーションが含まれています。

京都観光での実践例

これら3つのディスクリプタは、JapanTourクラスに統合されています。「京都」を目的地、価格を45000 JPY、評価を4.8として初期化すると、検証が即座に実行されます。著者が評価に6.0を代入しようとすると、例外が捕捉され「rating must be between 1.0 and 5.0.」というメッセージが表示されます。

旅程の初回参照時には、クエリシミュレーションメッセージが表示され、その後3日間のプログラム(京都到着・チェックイン、寺院ガイドツアー・屋台グルメ体験、新幹線での出発)が表示されます。2回目参照時にはメッセージは表示されず、インスタンスから直接値が読み取られます。

記事は、これら3種類のディスクリプタが、それぞれデータ整合性の確保、派生値の計算、高コスト操作の管理を通じて、クラス属性の堅牢性を強化すると結論付けています。