Python __在对象创建中未调用new_u;
案例1: 案例2:Python __在对象创建中未调用new_u;,python,class,oop,object,python-2.x,Python,Class,Oop,Object,Python 2.x,案例1: 案例2: class Person: def __new__(cls, *args, **kwargs): print "called" return super(Person, cls).__new__(cls, *args, **kwargs) p=Person() 在第一种情况下,不会调用\uuu new\uu()方法,但在第二种情况下会调用 如果它没有被调用,那么如何创建Person对象?我猜它与Python2有关: 旧式类实际上没有
class Person:
def __new__(cls, *args, **kwargs):
print "called"
return super(Person, cls).__new__(cls, *args, **kwargs)
p=Person()
在第一种情况下,不会调用\uuu new\uu()
方法,但在第二种情况下会调用
如果它没有被调用,那么如何创建
Person
对象?我猜它与Python2有关:
旧式类实际上没有_新_方法,因为对它们来说_init _是构造函数,所以基本上如果我们有:
class Person(object):
def __new__(cls, *args, **kwargs):
print "called"
return super(Person, cls).__new__(cls, *args, **kwargs)
p=Person()
在这种情况下,永远不会执行_unew _uu的主体,因为它不是旧式类的用途
在Python3中,行为是相同的,无论您是否显式地从对象继承:
class A:
def __new__(cls):
print "A.__new__ is called" # -> this is never called
A()
当从3.x调用时,这些应该打印“called”两次。我在寻找文档,最后在这里找到了它:
类型对象有一个新插槽tp_new,它可以作为
类型的实例。类型现在可以调用,因为tp_调用
插槽设置为PyType_Type(元类型);该函数查找
tp_正在调用的类型的新插槽
再加上@devforfu的答案,在过去,\uuuu new\uuu
并不存在。它是随着新样式类的添加而添加的。我99.999%确定您有这种向后的功能,并且\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>在第一种情况下不调用,但在第二种情况下调用。请参阅以获取测试。无论如何,如果您还不,最简单的方法就是不用费心去了解它们,除了如何不意外地创建它们。这是一种古老的知识,它不太可能对你有用。当然,如果您感到好奇,或者您(或其他搜索此问题的人)碰巧遇到一种非常罕见的情况,需要使用旧式类,那么有必要对堆栈溢出问题给出答案。Python 3中的行为相同的原因是,无论您是否这样说,您总是从对象
继承(这意味着没有旧式的类)。无论如何,通常我会推荐一个指向文档的链接,但是,顺便说一句,唯一的文档是在“类类型”和“经典类”的描述下,这还很不清楚。文档中可能有一些内容(有些未完成/过时)不过是文档。@abarnert是的,这是正确的,3.x中只有一种类型的类,这就是我的意思。
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()