为什么我的Python类没有调用__new__?

Jun*_*des 8 python python-2.x

我有一个像这样定义的类:

class Client():
    def __new__(cls):
        print "NEW"
        return cls

    def __init__(self):
        print "INIT"
Run Code Online (Sandbox Code Playgroud)

当我使用它时,我得到以下输出:

cl = Client()
# INIT
Run Code Online (Sandbox Code Playgroud)

__new__没有被召唤.为什么?

glg*_*lgl 7

读完答案之后,我就改进了

class Client(object):
    def __new__(cls):
        print "NEW"
        return super(Client, cls).__new__(cls)
    def __init__(self):
        print "INIT"
Run Code Online (Sandbox Code Playgroud)

这样c = Client()输出

NEW
INIT
Run Code Online (Sandbox Code Playgroud)

如预期.


Jun*_*des 6

类必须从明确继承object,以便__new__调用。重新定义,Client因此它看起来像:

class Client(object):
    def __new__(cls):
        print "NEW"
        return cls

    def __init__(self):
        print "INIT"
Run Code Online (Sandbox Code Playgroud)

__new__ 现在将在按以下方式使用时被调用:

cl = Client()
# NEW
Run Code Online (Sandbox Code Playgroud)

请注意,__init__在这种情况下将永远__new__不会调用__new__它,因为它不会调用超类的返回值。

  • 实际上,将调用__init__的原因是__new__返回的不是Client实例。它返回类“ Client”本身,它是“类型”的实例。 (4认同)
  • 通常你不能;实例通常是由object .__ new__最终创建的。但是您可以返回一个现有对象,或者调用其他一些不相关的代码,这些代码本身会调用object .__ new__。但是我的意思是,关于是否要调用__init__的规则仅是关于__new__是否返回该类的实例。与__new__是否包含超类调用无关。决定是否调用__init__的机制甚至都不知道这一点。 (2认同)