2023年7月28日金曜日

Pythonでどんな名前の属性でも受け入れることができる便利クラスを考える

Pythonでどんな名前の属性でも受け入れることができる便利クラスを考える

概要

__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 件のコメント:

コメントを投稿