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中这段代码错在哪里呢?

7 回复

class = metaclass.init(name, base, dict)


我无法理解你的问题。

不是很明白呢,是说作为 metaclass 的类 F,它的 init 方法要带专门的参数么?具体到我给的例子,应该怎么改呢?谢谢

关于出错信息,是不是说__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, 你没有必要去搞懂他, 事实上很多人都搞不清楚,先把其他简单的东西理解到了。

回到顶部