@property【プロパティ デコレータ】3.5property【プロパティ クラス】3.5 メモ 構文 例 メモプロパティ クラスはプロパティ (属性)の取得関数・設定関数・削除関数を指定 デコレータとして使用可 クラス内で使用した場合、オブジェクト.プロパティ名 でアクセス 読み込み専用のプロパティが容易に実装可 (getter のみを実装) ドキュメンテーション文字列は書き込み可 3.5 動的な名前でアクセスする場合は、下記を使用直接記述setattr()【属性設定】 ・getattr()【属性取得】 ・delattr()【属性削除】 外部リンク Python 標準ライブラリ組み込み関数class property(fget=None, fset=None, fdel=None, doc=None) 構文 # getter @property def prop(): ~ # setter @prop.setter def prop(value): ~ # deleter @prop.deleter def prop(): ~ propプロパティ名 valueプロパティ値 class property(fget=None, fset=None, fdel=None, doc=None) fgetプロパティ値の取得関数 fsetプロパティ値の設定関数 fdelプロパティ値の削除関数 docドキュメンテーション文字列 (省略:fgetのドキュメンテーション文字列) fgetプロパティ値の取得関数引数 (例)備考なし戻り値備考プロパティ値fsetプロパティ値の設定関数引数 (例)備考valueプロパティ値戻り値備考なしfdelプロパティ値の削除関数引数 (例)備考なし戻り値備考なし 例 class Person: def __init__(self, id, name, address, tel): self._id = id self._name = name self._address = address self._tel = tel # id (読み取り専用) @property def id(self): """id docstring""" return self._id # name (読み取り専用) def __get_name(self): """name docstring""" return self._name name = property(__get_name) # address (フルアクセス) @property def address(self): """address docstring""" return self._address @address.setter def address(self, value): self._address = value @address.deleter def address(self): del self._address # tel (フルアクセス) def __get_tel(self): return self._tel def __set_tel(self, value): self._tel = value def __del_tel(self): del self._tel tel = property(__get_tel, __set_tel, __del_tel, "tel docstring") staff = Person(123, "Yamada Taro", "Tokyo", "03-1234-5678") print(staff.id, staff.name, staff.address, staff.tel) # 出力:123 Yamada Taro Tokyo 03-1234-5678 print(Person.id.__doc__) # 出力:id docstring print(Person.name.__doc__) # 出力:name docstring print(Person.address.__doc__) # 出力:address docstring print(Person.tel.__doc__) # 出力:tel docstring # staff.id = 456 # 例外 AttributeError: can't set attribute # staff.name = "Sato Jiro" # 例外 AttributeError: can't set attribute staff.address = "Osaka" staff.tel = "06-1234-5678" print(staff.id, staff.name, staff.address, staff.tel) # 出力:123 Yamada Taro Osaka 06-1234-5678 Person.id.__doc__ = "ID" print(Person.id.__doc__) # 出力:ID Person.name.__doc__ = "NAME" print(Person.name.__doc__) # 出力:NAME Person.address.__doc__ = "ADDRESS" print(Person.address.__doc__) # 出力:ADDRESS Person.tel.__doc__ = "TEL" print(Person.tel.__doc__) # 出力:TEL # del staff.id # 例外 AttributeError: can't delete attribute # del staff.name # 例外 AttributeError: can't delete attribute del staff.address del staff.tel print(staff.id, staff.name) # 出力:123 Yamada Taro # print(staff.address) # 例外 AttributeError: 'Person' object has no attribute '_address' # print(staff.tel) # 例外 AttributeError: 'Person' object has no attribute '_tel'