クラス (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__
今度調べる。