我从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
这绝对是无限递归迭代的。
无限循环如何停止?
答案 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__
,怎么会有递归?