class Foo(object):
def __init__(self, *args, **kwargs):
pass
>>> foo = Foo(a, b=c)
- それは呼び出し
type.__call__(Foo, a, b=c)
です... (代わりtype
に、クラスのメタクラスにすることができます)
- ...
Foo.__new__(a, b=c)
のインスタンスを作成する呼び出しFoo
- ...そして呼び出し
foo.__init__(a, b=c)
て返すfoo
。
つまり、whereは次b = B(*args)
のように表現できます。type.__call__(B, *args)
type.__call__
class type(object):
def __call__(cls, *args, **kwargs)
obj = cls.__new__(*args, **kwargs)
obj.__init__(*args, **kwargs)
return obj
関数super
は、(通常の関数のように) 呼び出した場所で実行されます。
装飾は、クラスとメソッドの初期化で実行され、ラッパーで置き換えられます。
完全な例:
def dec(func):
print 'decorate', func.__name__
def wrapper(*args):
print 'call wrapper of', func.__name__
return func(*args)
return wrapper
class A(object):
def __new__(*args):
print 'call A.__new__'
return object.__new__(*args)
def __init__(self, *args):
print 'call A.__init__'
class MyMetaclass(type):
def __call__(mcls, *args):
print 'call MyMetaclass.__call__'
return super(MyMetaclass, mcls).__call__(*args)
class B(A):
__metaclass__ = MyMetaclass
@dec
def __new__(*args):
print 'call B.__new__'
return A.__new__(*args)
@dec
def __init__(self, *args):
print 'call B.__init__'
return super(B, self).__init__(*args)
print 'start creating instance'
b = B()
print 'end creating instance'
結果:
decorate __new__
decorate __init__
start creating instance
call MyMetaclass.__call__
call wrapper of __new__
call B.__new__
call A.__new__
call wrapper of __init__
call B.__init__
call A.__init__
end creating instance