2023年8月12日土曜日

Python でクラスに対してデコレートするとどうなるか

Python でクラスに対してデコレートするとどうなるか

概要

クラスからオブジェクトを作成する前後や作成するときに好きな処理を追加することができます

環境

  • Python 3.11.3

サンプルコード

from typing import Type


class User:
    def __init__(self, name: str) -> None:
        self.name = name


def deco(User: Type[User]):
    # これがコンストラクタの代わりのように振る舞う
    def func(name):
        return User(name + "!")

    return func


if __name__ == "__main__":
    # これだけだと内部の func はコールされない
    DecoUser = deco(User)
    # 実際にオブジェクトを生成する (デコレートされたクラスを使用する) と func を通る
    user = DecoUser("hawk")
    # ! マークが付与されていることが確認できる
    print(user.name)

最後に

デコレータは関数だけではなくクラス自体にも使えます
デコレータというよりかは内部関数 (クロージャ) の使い方かもしれませんが

0 件のコメント:

コメントを投稿