首页 > 解决方案 > __new__ 在对象创建中没有被调用

问题描述

情况1:

class Person:
    def __new__(cls, *args, **kwargs):
        print "called"
        return super(Person, cls).__new__(cls, *args, **kwargs)

p=Person()

案例2:

class Person(object):
    def __new__(cls, *args, **kwargs):
        print "called"
        return super(Person, cls).__new__(cls, *args, **kwargs)

p=Person()

在第一种情况下,__new__()不会调用该方法,但在第二种情况下会调用该方法。

如果它没有被调用,那么如何Person创建对象?

标签: pythonclassoopobjectpython-2.x

解决方案


我想这与Python2 中的新旧样式类有关:

旧式类实际上没有 __new__ 方法,因为对它们来说 __init__ 是构造函数,所以基本上如果我们有:

class A:

    def __new__(cls):
        print "A.__new__ is called"  # -> this is never called

A()

在这种情况下,__new__ 的主体永远不会被执行,因为它不是旧式类的目的。

在 Python3 中,行为是相同的,无论您是否显式继承了object以下内容:

class Person1:
    def __new__(cls, *args, **kwargs):
        print("called")
        return super(Person1, cls).__new__(cls, *args, **kwargs)


class Person2(object):
    def __new__(cls, *args, **kwargs):
        print("called")
        return super(Person2, cls).__new__(cls, *args, **kwargs)


p1 = Person1()
p2 = Person2()

当从 3.x 调用时,这些应该打印两次“调用”。


推荐阅读