我正在尝试创建(不完全还原)一个对象,该对象的属性保存在数据库中。因此,我不想致电__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__
返回一个类实例?
答案 0 :(得分:11)
构造函数(User()
)负责调用分配器(User.__new__()
)和初始化程序( User.__init__()
)反过来。由于永远不会调用构造函数,因此永远不会调用初始化程序。
答案 1 :(得分:10)
因为你绕过了通常的构造机制,直接调用__new__
。 __init__
- 后__new__
逻辑位于type.__call__
(在CPython中查看typeobject.c
,type_call
函数),因此仅在您执行时才会发生User(...)
{1}}。