Python 重写对象时不一致。\u新建__
在Python2和Python3中,以下代码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(
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
,因此这是false[1],并且不会引发错误。我们没有重写\uuuu new\uuuu
,因此这是真的[2],并抛出一个错误\uuuu init\uuuu
- 首先,调用
。它获取A.\uuuuu new\uuuuu
参数。我们调用1
,不带参数对象。\uuuu new\uuuu
- 第二,调用
对象。它获取
参数。我们没有重写1
,因此这是false[5],并且不会引发错误。我们确实重写了\uuuu init\uuuu
,因此这是false[6],并且不会引发错误\uuuuu new\uuuuu
[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