注意:関数デコレータを理解されていない方は、先にそちらを理解することをおすすめします。
型オブジェクト(クラスオブジェクト)の復習
型オブジェクト(クラスオブジェクト)で説明したとおり、Pythonではクラスもただのオブジェクトですので、変数にセットして関数の引数や戻り値として扱うことができます。
def add_member(cls): """ 型オブジェクト(クラスオブジェクト)に対し属性を追加する """ cls.x = 'sample' return cls class Sample: """ 何もないクラス """ pass NewSampleCls = add_member(Sample) # Sampleクラスから新たなクラスを作成する obj = NewSampleCls() # 新たなクラスをインスタンス化する print(obj.x) # Sampleクラスにはなかった属性xが取得できる
add_member関数は、型オブジェクトに対し、属性xを追加する関数です。また、Sampleクラスには属性がありません。ここでSampleクラスをadd_member関数に渡すと、属性xを持つクラスが新たに作成されます。
実際にインスタンス化してみると、属性xを持つことが確認できます。
クラスデコレータ
勘の良い方ならもうお気づきかもしれません。そう、クラスデコレータは関数デコレータのクラス版、つまりクラスの機能を追加・変更するデコレータです。上のコードをデコレータを使った記述に変えてみましょう。
def add_member(cls): """ 型オブジェクト(クラスオブジェクト)に対し属性を追加する """ cls.x = 'sample' return cls @add_member class Sample: """ 何もないクラス """ pass obj = Sample() # Sampleクラスをインスタンス化する print(obj.x) # Sampleクラスにはなかった属性xが取得できる
関数デコレータと同様に、元のクラスに変更を加えることなく機能追加をすることができました。