Published On: 1970-01-01|Last Updated: 1970-01-01|Categories: Uncategorized|

example

import traceback
class Klass(object):
class __metaclass__(type):
def __init__(self, name, bases, dict):
print '__metaclass__'
traceback.print_stack()
type.__init__(self, name, bases, dict)
print 'class'
traceback.print_stack()

result

まず Klass の内部コードが呼ばれる。次に __metaclass__ が呼ばれる。

どちらも <module> から呼ばれていることに留意したい。

class
File "metaclass.py", line 3, in <module>
class Klass(object):
File "metaclass.py", line 10, in Klass
traceback.print_stack()
__metaclass__
File "metaclass.py", line 3, in <module>
class Klass(object):
File "metaclass.py", line 7, in __init__
traceback.print_stack()

単純に class の attr の定義順を知りたいだけなんだけど。

super() もそうだけど、ここまで踏み込むと無理でないにしろ面倒なことが出てくる。

今書いてるコードは class の定義時に必ず呼ばれるオブジェクトがあるのでとりあえず問題ない。

関連