class F(type):
def __init__(self):
print("F init")
def __call__(self):
print("F call")
class C1(F):
def __init__(self):
print("C1 init")
def __call__(self):
print("C1 call")
class C2(object,metaclass=F):
pass
print("--------")
c1=C1()
c1()
print("c1 OVER")
c2=C2()
c2()
print("c2 OVER")
上面代码报错如下,请问这是怎么回事呢?
class C2(object,metaclass=F):
TypeError: init() takes 1 positional argument but 4 were given
1
lrxiao 2017-08-23 23:41:24 +08:00
class = metaclass.__init__(name, base, dict)
|
2
saximi OP @lrxiao 不是很明白呢,是说作为 metaclass 的类 F,它的 init 方法要带专门的参数么?具体到我给的例子,应该怎么改呢?谢谢
|
4
ivechan 2017-08-24 11:12:31 +08:00
@saximi 不是,反过来。
错误的意思是,你定义的 __int__ 方法只定义了一个参数(self),但是你传入了 4 个参数。 当然,其实不是你显式传入的, 是因为如果你指定了某个 metaclass,那么 Python 会自动调用 metaclass(name, bases, namespace, **kwds)。 具体建议你查看别人的 metaclass 是怎么写的。 |
5
saximi OP @ivechan 谢谢,我搞清楚 metaclass 的参数了,是这几个(self, what, bases, dict),代码也改对了。
但是我进一步把程序改成如下所示就出错了。 ``` class F(type): def __init__(self,what,bases=None,dict=None): print("F init") def __call__(self): print("F call") class C2(F): pass print("begin") c2=C2() print("end") ``` 报错如下: c2=C2() TypeError: type.__new__() takes exactly 3 arguments (0 given) 这个问题在哪里呢? |