“ __new__”创建无限递归循环

时间:2018-11-01 05:59:45

标签: python-3.x

我从new and init | Spyhce blog学到了__new__这样的例子:

class A(object):  

    def __new__(cls):
        return super(A, cls).__new__(cls) #I think here is an infinite recursive

该代码可以重写为

class A(object):  

    def __new__(A):
        return object.__new__(A) 

它是算法:

1,定义一个从对象继承的对象
2,用__new__覆盖方法def __new__(A),但是直到调用参数A才实现参数A
3,对象。新建(A),递归调用A

这绝对是无限递归迭代的。

无限循环如何停止?

2 个答案:

答案 0 :(得分:0)

这不会导致无限递归,因为您没有调用__new__类的A()方法。您正在调用它的__new__()类的super方法,该方法仍未更改,其行为与默认方法相同。

所以现在很简单,因为该方法属于其超类 not 您的A类,因此 __new__要求将类引用传递给第一个参数,它将为您创建实例。这就是super(A, cls).__new__(cls)行的内容。

答案 1 :(得分:0)

正如在另一个答案的评论中明确指出的那样,您将静态方法 __new__ 的局部变量 A 误认为是存在于更全局范围内的类名 A。按照惯例,这类似于 __new__ 的 cls,您选择键入 A 会让您感到困惑。我认为这是对 Python 中最早学到的概念之一过度思考的一个例子。

在对 object.__new__ 的内部调用中的 A 与您为类名选择的 A 不同。无论是编程魔术方法还是简单的脚本,范围都是相关的。

您在示例之间错误地更改了这一点......导致您的困惑。 cls(正如您在第一个版本中正确编写的那样)本质上是类定义的占位符,它一次和此处仅发送到不同的方法,因此没有回调,例如 if object.__new__(x)x.__new__,怎么会有递归?