
「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lecturesの実習中。今回もデコレータの練習です。今回は処理系に備わっているデコレータを使ってClass定義にセッタ、ゲッタ、デリータを追加してみます。ちょっとクセ強な風味だけれどもプロパティ使えばOKよ。
※「 ソフトな忘却力」投稿順 Index はこちら
※Sypder IDEはWindows版 6.0.7使用です。Python処理系はPython 3.11.12です。
※Scientific Python Lectures様のコースは例題だけでなく、エクササイズなども充実、それを全部順番に解いていったら必ずや立派な人になれるだろ~と思います。でも老い先短い年寄には量が多過ぎて多分死ぬまでに終わりません。適当な練習でお茶を濁してます。今回は「7.2 Decorators」の「7.2.4 Examples in the standard library」の続きです。
@propertyデコレータ
大方の「オブジェクト指向」言語で、クラスのインスタンス変数への無制限なアクセスをコントロール下におくために、ゲッタ、セッタといったメソッドを定義できることが普通じゃないかと思います。直接アクセスを許さず、一枚チェックしてからのアクセスに制限したり、条件によっては禁止するなどいろいろ出来ますな。まあ、「使うべきじゃない」派の方もいるみたいですが。
Pythonにおいては、@propertyと記すデコレータあり。これを使うことでgetter、setterだけでなく、削除を行う deleter も定義可能でやんす。便利ね。
上記のクラス定義例のように、
-
- インスタンス変数名は _ で始める「プライベート」なお名前にしておく
- インスタンス変数への直接アクセスは許さず、プロパティ(‗がつかないお名前)経由でアクセスできるようにする(その実体は@propertyデコレータ以下で作られるメソッド)
- まず最初に@propertyデコレータでゲッタ相当のメソッドを定義
- 次に@プロパティ名.setterで、セッタ相当のメソッドを定義
- 必要であれば@プロパティ名.deleterで、デリータ相当のメソッドを定義
という段取りっす。
今回練習のために作成したスクリプト
以下の練習用スクリプトで、セッタ、ゲッタ、デリータの練習してみようと思います。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue Aug 19 2025 @author: jhalfmoon getter、setter、deleter """ class SampleClass(object): def __init__(self, pval): self._pval = pval @property def pval(self): """getter""" return self._pval @pval.setter def pval(self, value): """setter""" self._pval = value @pval.deleter def pval(self): """deleter""" del self._pval def main(): inst0 = SampleClass(333) print("Getter: ", inst0.pval) inst0.pval = 222 print("After Setter: ", inst0.pval) del inst0.pval if 'pval' in inst0.__dict__: print("After Deleter: ", inst0.pval) else: print("After Deleter: No pval exists.") if __name__ == '__main__': main()
実際にセッタ、ゲッタ、デリータしてみた結果
上記のスクリプトのセッタ、ゲッタなど動かしてみる部分が以下に。
予定どおりゲッタ、セッタ、デリータできておるみたい。あたりまえか。