【发布时间】:2020-10-27 02:13:01
【问题描述】:
在元类中覆盖 __new__ 时调用 super().__new__() 包含以下函数签名:
class MyMeta(type):
def __new__(cls, name, bases, classdict):
clsobj = super().__new__(cls, name, bases, classdict)
但是,当在普通类中覆盖 __new__ 时,我们有以下内容:
class A:
def __new__(cls, *a, **kw):
clsobj = super().__new__(cls)
在A.__new__ 中将任何其他参数传递给super() 将导致以下错误:
TypeError: object.__new__() takes exactly one argument (the type to instantiate)
我知道在第二种情况下,我们正在处理object.__new__,而在第一种情况下,我们正在处理type.__new__。
我的问题是,为什么这些函数签名不同?为什么object.__new__ 只接受cls?
【问题讨论】:
-
是的,函数签名不同。因为
type.__new__和object.__new__做不同的事情。虽然,也许真正的问题是,为什么object.__new__不接受 any 参数,例如*args, **kwargs...
标签: python python-3.7 super metaclass