Python 重写对象时不一致。\u新建__

Python 重写对象时不一致。\u新建__,python,python-3.x,python-2.7,object,constructor,Python,Python 3.x,Python 2.7,Object,Constructor,在Python2和Python3中,以下代码 class A(object): pass A(1) class A(object): def __new__(cls, *args, **kwargs): return super(A, cls).__new__(cls) A(1) 预期会引发以下异常 TypeError: object() takes no parameters 但是,下面的代码 class A(object): pass A(

在Python2和Python3中,以下代码

class A(object):
    pass

A(1)
class A(object):
    def __new__(cls, *args, **kwargs):
        return super(A, cls).__new__(cls)

A(1)
预期会引发以下异常

TypeError: object() takes no parameters
但是,下面的代码

class A(object):
    pass

A(1)
class A(object):
    def __new__(cls, *args, **kwargs):
        return super(A, cls).__new__(cls)

A(1)

没有提出任何问题。为什么会这样?

答案在于
对象是如何处理的。
[1]和
对象。
[2]处理额外的参数

让我们看几个例子:

class A(object):
    pass

>>> A(1)
TypeError: object() takes no parameters
  • 首先,调用对象。它获取
    1
    参数。我们没有重写
    \uuuu new\uuuu
    ,因此这是false[1],并且不会引发错误。我们没有重写
    \uuuu init\uuuu
    ,因此这是真的[2],并抛出一个错误
  • 首先,调用
    A.\uuuuu new\uuuuu
    。它获取
    1
    参数。我们调用
    对象。\uuuu new\uuuu
    ,不带参数
  • 第二,调用
    对象。它获取
    1
    参数。我们没有重写
    \uuuu init\uuuu
    ,因此这是false[5],并且不会引发错误。我们确实重写了
    \uuuuu new\uuuuu
    ,因此这是false[6],并且不会引发错误
[1]

[2]

[3]

[4]

[5]


[6]

问得好。它看起来像是
type.\uuuu call\uuuu
(当您运行
A(1)
)时实际调用的是
A.\uu new\uuuu
)根本不调用
A.\uu init\uuu
如果
A.\uu new\uu
已定义,但
A.\uu init,
object.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,或者如果是,它只是默默地忽略了额外的参数。要弄清楚到底发生了什么,需要深入了解Python实现的源代码。以下是
type的源代码。\uuu call\uuu
这是否回答了您的问题?(答案比问题更符合!)这是什么口译员?您的上一个类定义根本不调用
\uuuuu init\uuuu
,因为
\uuuu new\uuuuu
返回
None