Home >Backend Development >Python Tutorial >Why is Python's `__init__()` Always Called After `__new__()`?

Why is Python's `__init__()` Always Called After `__new__()`?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-18 17:36:10551browse

Why is Python's `__init__()` Always Called After `__new__()`?

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:

  1. __new__() is called first to allocate and potentially return an existing instance.
  2. If __new__() returns a new instance, __init__() is then called to initialize the instance.

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn