Python中这段代码错在哪里呢?
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
Python中这段代码错在哪里呢?
class = metaclass.init(name, base, dict)
我无法理解你的问题。
关于出错信息,是不是说__init__方法应该要传入 4 个参数,但是实际只传了一个位置参数?
不是,反过来。
错误的意思是,你定义的 int 方法只定义了一个参数(self),但是你传入了 4 个参数。
当然,其实不是你显式传入的, 是因为如果你指定了某个 metaclass,那么 Python 会自动调用
metaclass(name, bases, namespace, **kwds)。
具体建议你查看别人的 metaclass 是怎么写的。
谢谢,我搞清楚 metaclass 的参数了,是这几个(self, what, bases, dict),代码也改对了。
但是我进一步把程序改成如下所示就出错了。<br>class F(type):<br> def __init__(self,what,bases=None,dict=None): <br> print("F init") <br> def __call__(self): <br> print("F call") <br><br>class C2(F):<br> pass <br><br>print("begin")<br>c2=C2()<br>print("end") <br><br>
报错如下:
c2=C2()
TypeError: type.new() takes exactly 3 arguments (0 given)
这个问题在哪里呢?
你的 F 类是 metaclass, 你为什么要继承它?
metaclass 是控制类的生成的,而不是作为父类使用的。
如果你不是为了用 metaclass, 你没有必要去搞懂他, 事实上很多人都搞不清楚,先把其他简单的东西理解到了。


