メタクラスメモ
>>> class Meta(type): ... def __new__(name, *args): ... print 'created' ... name = 'Memeta!' ... return type(name, *args) >>> class A(object): ... __metaclass__ = meta 'created' >>> A.__name__ 'Memeta!' >>> def meta(name, *args): ... print 'created' ... name += '!' ... return type(name, *args) >>> class A(object): ... __metaclass__ = meta 'created' >>> A.__name__ 'A!' 以下、py3kではできなくて悲しい。 >>> class A(object): ... class __metaclass__(name, *args): ... def __new__(name, *args): ... print 'created' ... name += '!' ... return type(name, *args) 'created' >>> A.__name__ 'A!' >>> class A(object): ... def __metaclass__(name, *args): ... print 'created' ... name += '!' ... return type(name, *args) 'created' >>> A.__name__ 'A!'
メタクラス用メソッド
metaclsはメタクラスのクラスインスタンス(type)、nameはクラス名(Class.__name__)、basesは継承元(tuple)、dictはClass.__dict__(クラス変数やinstance method等)
- Class定義時
- Meta::__new__(metaclass, name, bases, dict) -> class object(type)
- Meta::__init__(target_class, name, bases, dict) -> None
- Instance生成時(Class call時)
- Meta::__call__(target_class, *args, **kwds) -> instance(object)
- # Metaで__call__を定義すると、以下2つは自動的に呼ばれなくなる*1
- Class::__new__(target_class, *args, **kwds) -> instance(object)
- Class::__init__(instance, *args, **kwds) -> None
- Meta::__call__(target_class, *args, **kwds) -> instance(object)
*1:type::__call__の動作を上書きするってことだろう