Dan Dan - 17 days ago 5
Python Question

Python's use of __new__ and __init__?

I'm just trying to streamline one of my classes and have introduced some functionality in the same style as the flyweight design pattern.

However, I'm a bit confused as to why

__init__
is always called after
__new__
. I wasn't expecting this. Can anyone tell me why this is happening and how I implement this functionality otherwise? (apart from putting the implementation into the
__new__
which feels quite hacky).

Here's an example:

class A(object):
_dict = dict()

def __new__(cls):
if 'key' in A._dict:
print "EXISTS"
return A._dict['key']
else:
print "NEW"
return super(A, cls).__new__(cls)

def __init__(self):
print "INIT"
A._dict['key'] = self
print ""

a1 = A()
a2 = A()
a3 = A()


Outputs:

NEW
INIT

EXISTS
INIT

EXISTS
INIT


Why?

Answer

Use __new__ when you need to control the creation of a new instance. Use __init__ when you need to control initialization of a new instance.

__new__ is the first step of instance creation. It's called first, and is responsible for returning a new instance of your class. In contrast, __init__ doesn't return anything; it's only responsible for initializing the instance after it's been created.

In general, you shouldn't need to override __new__ unless you're subclassing an immutable type like str, int, unicode or tuple.

From: http://mail.python.org/pipermail/tutor/2008-April/061426.html

You should consider that what you are trying to do is usually done with a Factory and that's the best way to do it. Using __new__ is not a good clean solution so please consider the usage of a factory. Here you have a good factory example.

Comments