__new__ vs. __init__ Methods in Python

In Python, the __new__ method creates and returns a new object of a class, while the __init__ method initializes the attributes of a newly created object of a class. Learn more about what each does and when to use which.

Written by Liu Zuo Lin
software developer writing python
Image: Shutterstock / Built In
Brand Studio Logo
UPDATED BY
Brennan Whitfield | Sep 12, 2025
Summary: Python's __new__ method creates a new object, acting as a class-level constructor. The __init__ method, an instance method, then initializes the object's attributes. __new__ runs first, with __init__ following.

When learning about object-oriented programming (OOP) in Python, you’ll come across the __new__ and  __init__ magic methods. These two methods play a vital role in the creation and initialization of objects in Python.

What Are the __init__ and __new__ Methods in Python?

In Python, __new__ is a static method that's responsible for creating and returning a new instance (object) of a class. It receives the class itself as its first argument. __init__ is an instance method that initializes a newly created instance (object). It takes the object as its first argument followed by additional arguments.

 

A tutorial on how to use __new__ and __init__ in Python. | Video: mCoding

What Is the __new__ Method in Python?

The __new__ method is a static method that belongs to a class itself. It’s responsible for creating and returning a new instance (object) of the class.

The method takes the class as its first argument, followed by any additional arguments that need to be passed to it.

class MyClass:
    def __new__(cls, *args, **kwargs):
        instance = super().__new__(cls)
        return instance

The __new__ method is called before __init__ and is used to control the object creation process. Inside this method, a call to super().__new__(cls) is typically made. This step delegates the actual creation of the object’s memory to the parent class, ensuring the new instance is properly built before it’s returned.

 

What Is the __init__ Method in Python?

The __init__ method is an instance method that automatically initializes a newly created object. While it operates on an instance, it’s not called directly by the programmer, and is invoked automatically by Python after the __new__ method creates the object.

The method takes the object as its first argument (self), followed by any additional arguments that need to be passed to it.

class MyClass:
    def __init__(self, *args, **kwargs):
        self.attribute = 'value'

The __init__ method is called after an object is created by the __new__ method, and it initializes the object attributes with the values passed as arguments.

Related5 Pandas Groupby Tricks to Know

 

Differences Between __new__ and __init__ in Python

  • __init__ is an instance method, while __new__ is a static method.
  • __new__ is responsible for creating and returning a new instance (object), while __init__ is responsible for initializing the attributes of the newly created object.
  • __new__ is called before __init__.
  • __new__ happens first, then __init__.
  • __new__ can return any object, while __init__ must return None.

 

When to Use __new__ in Python

You should use __new__ when you need to customize the object creation process itself, before __init__ is even called. For example, you can use __new__ to:

  • Ensure that the object is of a certain type.
  • Set the object’s initial state (especially when working with immutable classes).
  • Prevent the object from being created.

 

When to Use __init__ in Python

You should use __init__ when you need to initialize the object. For example, you might want to use __init__ to:

  • Set the object’s attributes.
  • Call the object’s superclass’ __init__ method.
  • Perform other initialization tasks.

RelatedPython TypeError: String Indices Must Be Integers

 

Python __new__ and __init__ Example

To better understand the differences between __new__ and __init__, let’s take a look at a simple example:

class Person:
    def __new__(cls, name, age):
        print("Creating a new Person object")
        instance = super().__new__(cls)
        return instance

    def __init__(self, name, age):
        print("Initializing the Person object")
        self.name = name
        self.age = age

person = Person("John Doe", 30)
print(f"Person's name: {person.name}, age: {person.age}")

# Creating a new Person object
# Initializing the Person object
# Person's name: John Doe, age: 30

In this example, we can see how the __new__ method is called before the __init__ method, and how they work together to create and initialize the Person object.

Frequently Asked Questions

The __new__ method in Python is a static method and constructor that creates and returns a new instance (object) of a class. __new__ is often used to help control the creation of objects and is called before __init__.

The __init__ method in Python is an instance method that initializes a newly created instance (object) of a class. After a new object is created, __init__ is automatically called to initialize the object’s attributes with the values given as arguments.

The __init__ method in Python helps define object attributes necessary to the class program from the start, plus it facilitates any initial code setup when working with objects and classes.

__init__ is an instance method in Python often used as a constructor to initialize the attributes of a newly created instance (object) of a class.

__new__ and __init__ are both special methods in Python that play distinct roles in object creation.

__new__ is a static method that's responsible for creating and returning a new instance (object) of a class. Once the object is created, __init__, an instance method, is automatically called to initialize the object's attributes. __new__ is always called before __init__ and can return any object, whereas __init__ must return None.

Explore Job Matches.