在学习openstack源码的时候发现一个类里面有'__new__' 和'__init__'两个构造,不知道什么原因,在stackoverflow中找到了满意的解答:
粘贴解答至此:
You can define either or both of __new__
and __init__
.
__new__
must return an object -- which can be a new one (typically that task is delegated to type.__new__
), an existing one (to implement singletons, "recycle" instances from a pool, and so on), or even one that's not an instance of the class. If __new__
returns an instance of the class (new or existing), __init__
then gets called on it; if __new__
returns an object that's not an instance of the class, then __init__
is not called.
__init__
is passed a class instance as its first item (in the same state __new__
returned it, i.e., typically "empty") and must alter it as needed to make it ready for use (most often by adding attributes).
In general it's best to use __init__
for all it can do -- and __new__
, if something is left that __init__
can't do, for that "extra something".
So you'll typically define both if there's something useful you can do in __init__
, but not everything you want to happen when the class gets instantiated.
For example, consider a class that subclasses int
but also has a foo
slot -- and you want it to be instantiated with an initializer for the int
and one for the .foo
. As int
is immutable, that part has to happen in __new__
, so pedantically one could code:
>>>class x(int):...def __new__(cls, i, foo):... self = int.__new__(cls, i)...return self
...def __init__(self, i, foo):... self.foo = foo
... __slots__ ='foo',...>>> a = x(23,'bah')>>>print a
23>>>print a.foo
bah
>>>
In practice, for a case this simple, nobody would mind if you lost the __init__
and just moved the self.foo = foo
to __new__
. But if initialization is rich and complex enough to be best placed in __init__
, this idea is worth keeping in mind.