Python __在对象创建中未调用new_u;

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有关: 旧式类实际上没有

案例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有关:

旧式类实际上没有_新_方法,因为对它们来说_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()