情况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
对象?
答案 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__
不存在。它是通过添加新样式类而添加的。