如果没有args调用__new__,为什么不调用__init__

时间:2011-08-01 19:28:42

标签: python

我正在尝试创建(不完全还原)一个对象,该对象的属性保存在数据库中。因此,我不想致电__init__。这种愿望似乎与Guido's intended use for __new__一致。我不明白为什么__init__没有被调用。

以下面的代码段为例,它返回一个类User的实例,而不调用__init__

class User(object):
    def __init__(self, arg1, arg2):
        raise Exception

user = User.__new__(User)

print user
<project.models.User object at 0x9e2dfac>

这是我想要的确切行为。但是,我的问题是我不明白为什么?

根据python docs __init__应该在__new__“返回cls实例时调用。”

那么为什么__init__甚至不被调用,即使__new__返回一个类实例?

2 个答案:

答案 0 :(得分:11)

构造函数User())负责调用分配器User.__new__())和初始化程序User.__init__())反过来。由于永远不会调用构造函数,因此永远不会调用初始化程序。

答案 1 :(得分:10)

因为你绕过了通常的构造机制,直接调用__new____init__ - 后__new__逻辑位于type.__call__(在CPython中查看typeobject.ctype_call函数),因此仅在您执行时才会发生User(...) {1}}。