__new__在对象创建中没有被调用

时间:2018-07-04 03:52:11

标签: python class oop object python-2.x

情况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对象?

2 个答案:

答案 0 :(得分:2)

我想这与Python2中的new and old style classes有关:

  

老式类实际上没有__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调用时,这些应打印两次“被调用”。

答案 1 :(得分:1)

我一直在寻找文档,最后在这里找到它: https://staging2.python.org/dev/peps/pep-0253/

  

类型对象有一个新的插槽tp_new,可以用作   类型的实例。现在可以调用类型,因为tp_call   slot是在PyType_Type(元类型)中设置的;该功能寻找   tp_new所调用类型的插槽。

要加上@devforfu的答案,在过去,__new__不存在。它是通过添加新样式类而添加的。