我正在尝试学习python 3.7中的元类,并具有以下代码
class Foo(type):
def __new__(cls, *args, **kwargs):
return super().__new__(cls, *args, **kwargs)
def __init__(self, *args, **kwargs):
return super().__init__(*args, **kwargs)
def __call__(cls, *args, **kwargs):
return super().__call__(cls, *args, **kwargs)
class Bar(metaclass=Foo):
def __new__(cls, *args, **kwargs):
print(cls)
print(args)
print(kwargs)
return super().__new__(cls, *args, **kwargs)
def __init__(self, *args, **kwargs):
return super().__init__(*args, **kwargs)
b = Bar()
当我运行它时,我得到输出
<class '__main__.Bar'>
(<class '__main__.Bar'>,)
{}
和错误
File "meta/main.py", line 91, in __new__
return super().__new__(cls, *args, **kwargs)
TypeError: object.__new__() takes no arguments
该行对应于__new__
中的Bar
调用
我不知道为什么要传入第二个<class '__main__.Bar'>
。如果我将Bar
更改为不使用Foo
元类(即将class Bar(metaclass=Foo):
更改为{ {1}})我得到
class Bar:
,并且没有错误(正如我期望的那样)。感谢您的帮助
答案 0 :(得分:2)
您在通话中传递了一个额外的参数:
def __call__(cls, *args, **kwargs):
return super().__call__(cls, *args, **kwargs)
__call__
不是隐式静态方法,请删除该cls
参数:
def __call__(cls, *args, **kwargs):
return super().__call__(*args, **kwargs)