Home  >  Article  >  Backend Development  >  Python interview frequently asked questions: The difference between __Init__ and __New__

Python interview frequently asked questions: The difference between __Init__ and __New__

PHPz
PHPzforward
2023-04-12 14:31:061487browse

Python interview frequently asked questions: The difference between __Init__ and __New__

Methods defined within a Python class and ending with _ _ xx _ _ are all built-in methods of the class, also called magic methods.

The built-in methods of the class will be automatically triggered when certain conditions are met. Here we focus on explaining __init__ and __new__, which are related to instance creation.

Brief description__init__

__init__(self): We are relatively familiar with this method. It is the default initialization method in Python classes, that is, the method that will be executed when a class is instantiated. .

Detailed explanation of __new__

__new__ Method rewriting is very fixed, usually as follows:

def __new__(cls):
return super().__new__(cls)

where cls represents the class itself.

The code for rewriting the __new__ method is very fixed: when rewriting the __new__ method, you must return super().__new__(cls), or return object.__new__(cls), otherwise the python interpreter will fail. To reference an object with allocated space, the object's initialization method will not be called. For example:

class Mycls:
def __new__(cls):
 print('new')
 return super().__new__(cls)
def __init__(self):
print('init')
my=Mycls()

Output:

  • new
  • init

We can see that new is output before init, proving __new__ (cls) is executed before __init__(self).

We rewrite the code:

def __new__(cls):
 print('new')
my=Mycls()
print(my)

Output:

  • new
  • None

You can see if There is no return value in __new__(cls): no instance will be returned, and __init__(self) will not be executed.

Summary of __new__ and __init__

1. The __new__() method is used to create an instance. It will be called first before the class is instantiated. It is a class method and a static method. The __init__() method is used to initialize the instance. This method is called after the instance object is created. It is a method of the instance object and is used to set some initial values ​​​​of the class instance object.

2. If both the __init__() method and the __new__() method appear in the class, the __new__() method will be called first and then the __init__() method. The __new__() method is the first step in creating an instance. After execution, the instance of the created class needs to be returned. Otherwise, an error will be reported and the __init__() method cannot be executed. Among them, the __init__() method will not return any information.

Application of __new__

Some students will ask what can be achieved using __new__?

Personally, I think singleton is the most classic application. Singleton Pattern is a commonly used software design pattern. The main purpose of this pattern is to ensure that only one instance of a certain class exists. Singleton objects come in handy when we want only one instance of a certain class to appear in the entire system. For example, there can be multiple printing tasks in a system, but there can only be one working task; a system can only have one window manager or file system; a system can only have one timing tool or ID (serial number) generator .

The specific implementation code is as follows:

class Mycls:
_instance = None
 def __new__(cls):
 # 判断该类的属性是否为空;对第一个对象没有被创建,我们应该调用父类的方法,为第一个对象分配空间
 if cls._instance == None:
 # 把类属性中保存的对象引用返回给python的解释器
cls._instance = object.__new__(cls)
return cls._instance
# 如果cls._instance不为None,直接返回已经实例化了的实例对象
else:
return cls._instance
def __init__(self):
print('init')
my1=Mycls()
print(my1)
my2=Mycls()
print(my2)

Output:

init
<__main__.Mycls object at 0x000000406E471148>
Init
<__main__.Mycls object at 0x000000406E471148>

You can see that although they are called my1 and my2, they are both objects 0x000000406E471148. This is the application of the singleton mode. .

The above is the detailed content of Python interview frequently asked questions: The difference between __Init__ and __New__. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:51cto.com. If there is any infringement, please contact admin@php.cn delete