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 can 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?
From April 2008 post: When to use
__new__vs.__init__? on mail.python.org.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’s a good example: ActiveState Fᴀᴄᴛᴏʀʏ ᴘᴀᴛᴛᴇʀɴ Recipe.