2023年1月20日金曜日

slots を使ったクラスの属性を kwargs から初期化する方法

slots を使ったクラスの属性を kwargs から初期化する方法

概要

slots を使ったクラスを定義している場合に使えるテクニックを紹介します

環境

  • macOS 11.7.2
  • Python 3.10.2

サンプルコード

class User():
    __slots__ = (
        "name",
        "age"
    )


class Test():
    def __init__(self, **kwargs):
        self.user = User()
        for k, v in kwargs.items():
            setattr(self.user, k, v)


t1 = Test(name="hawk", age=20)
print(t1.user.name)
t2 = Test(error=-1)

解説

__slots__ は属性を宣言することができる機能です
宣言するだけなのでコンストラクタで初期化したりすることはできずまた __dict__ が生成されないのでメモリの節約になります

kwargs などをそのまま slots を使ったクラスに展開する場合は setattr を使うと良いです
slots に定義されている属性はそのまま設定されますが slots にない属性を setattr しようとするとエラーになるので注意しましょう

0 件のコメント:

コメントを投稿