Understanding the Sequence of __init__() and __new__()
In Python, the __new__() and __init__() methods play crucial roles in the instance creation process. However, many developers wonder why __init__() is always called after __new__().
Purpose of __new__()
__new__() is responsible for controlling the creation of a new instance. It initializes the instance's allocation and returns the instance itself. Essentially, __new__() decides whether to create a new instance or reuse an existing one.
Purpose of __init__()
__init__() is used for object initialization. It sets the instance's attributes and runs any necessary setup code. __init__() doesn't return anything, as its primary purpose is to initialize the object's state.
Sequence in Instance Creation
The sequence in instance creation is always:
Example
The following example illustrates how __new__() controls instance creation:
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()
Output:
NEW INIT EXISTS INIT EXISTS INIT
As you can see, __new__() first checks if an instance already exists in _dict. If so, it returns that existing instance. Otherwise, it creates a new instance and returns it. __init__() is then called to initialize each instance.
Alternatives to Using __new__()
In most cases, using __new__() to implement your own flyweight design pattern is not recommended. Instead, consider using a factory class or an object pool to manage the creation and reuse of instances.
The above is the detailed content of Why is Python's `__init__()` Always Called After `__new__()`?. For more information, please follow other related articles on the PHP Chinese website!