次のコードではエラーが発生します。
class FooMeta(type):
def __new__(mcl, classname, bases, classdict):
return type.__new__(mcl, classname, bases, dict())
def __init__(cls, name, bases, classdict):
super(FooMeta, cls).__init__(name, bases, classdict)
d = dict()
for key, item in classdict.items():
if key.startswith("_"):
setattr(cls, key, item)
else:
d[key] = item
setattr(cls, '_items', d)
class Foo(object):
__metaclass__ = FooMeta
class Passing(Foo):
def __init__(self, *args, **kw):
pass
class Failing(Foo):
def __new__(cls, *args, **kw):
return super(Failing, cls).__new__(cls)
def __init__(self, *args, **kw):
pass
fail = Failing()
エラーは
Traceback (most recent call last):
File ".../FooMeta,py", line 30, in <module>
fail = Failing()
TypeError: unbound method __new__() must be called with Failing instance as first argument (got FooMeta instance instead)
__new__
メタクラスから呼び出される場合、呼び出し方に若干の違いがあるようです。
1) どうしてこうなったか分かる人いますか? 2)それを修正する方法はありますか?