メタクラスメモ

>>> 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

*1:type::__call__の動作を上書きするってことだろう