クラス (or クラス宣言) は第一級オブジェクト
参考:
- https://note.crohaco.net/2016/python-metaclass/
- https://qiita.com/fujimisakari/items/0d4786dd9ddeed4eb702
クラスを宣言するということは、type クラスのインスタンスを作成していることと等価。
class C: ... ≡ C = type('C', ...)
クラス生成のカスタマイズ
参考:
この、type インスタンス生成をカスタマイズするのが metaclass
指定。メタクラス M
を type
のサブクラスとして宣言し、 __new__
メソッドをオーバーライドすることにより、あるクラス宣言時のクラス生成をカスタマイズできる:
class C(metaclass=M): ...
すべてのクラス生成時に強制的に M
を適用することはできないと推測している [要調査]。
インスタンス生成のカスタマイズ
参考:
インスタンス生成のカスタマイズはクラスの __new__
および __init__
を定義 (オーバーライド) して行う。
特に、__new__
をカスタマイズすることにより、生成が意図されたクラス (c = C(...)
の C
) 以外のクラスインスタンスを生成して返す事が可能になる。これは例えばファクトリクラスの実装に使える。
一方、御存知の通り、__init__
は生成されたインスタンスの初期化 (プロパティの設定など) に使用される。
未調査: __prepare__
今度調べる。