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.
__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. .
__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:
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:
You can see if There is no return value in __new__(cls): no instance will be returned, and __init__(self) will not be executed.
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.
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!