概要
__setattr__
, __getattribute__
をオペレーションオーバライドしてどんな名前の属性でも設定/取得できるような便利クラスを作ってみます
環境
- Python 3.11.3
サンプルコード
from typing import Any
class AnythingOK:
def __setattr__(self, __name: str, __value: Any) -> None:
super().__setattr__(__name, __value)
def __getattribute__(self, __name: str) -> Any:
try:
return super().__getattribute__(__name)
except AttributeError:
return None
if __name__ == "__main__":
aok = AnythingOK()
aok.name = "hawksnowlog"
print(aok.name)
print(aok.age)
aok.age = 10
print(aok.age)
指定の属性がない場合は None を返却します
使い道
- とりあえず値を保持しておきたい場合に dict や list ではなくオブジェクトとして保存したい場合に使えるかも
- 属性名などが動的に変わる場合に使えるかも
- クラスとして定義しているので to_dict などの便利メソッドを生やせば追加した属性の一覧や加工などが簡単に行えるかも
注意点
__setattr__
内で setattr() をコールすると RecursionError になるのでコールしないようにしましょう
__getattribute__
内で hasattr() や dir() をコールすると RecursionError になるのでコールしないようにしましょう
最後に
便利なのだろうか
0 件のコメント:
コメントを投稿