Maison >développement back-end >Tutoriel Python >Questions fréquemment posées sur l'entretien Python : la différence entre __Init__ et __New__
Définies à l'intérieur d'une classe Python, les méthodes se terminant par _ _ xx _ _ sont toutes des méthodes intégrées de la classe, également appelées méthodes magiques.
Les méthodes intégrées de la classe seront automatiquement déclenchées lorsque certaines conditions sont remplies. Ici, nous nous concentrons sur l'explication de __init__ et __new__, qui sont liés à la création d'instances.
__init__(self) : Nous connaissons relativement bien cette méthode. C'est la méthode d'initialisation par défaut dans les classes python, qui est une méthode qui sera exécutée lorsqu'une classe est instanciée.
__new__ est très fixe, généralement comme suit :
def __new__(cls): return super().__new__(cls)
où cls représente la classe elle-même.
Le code de réécriture de la méthode __new__ est très fixe : lors de la réécriture de la méthode __new__, vous devez renvoyer super().__new__(cls), ou renvoyer object.__new__(cls), sinon l'interpréteur python ne pourra pas allouer space. Référence d'objet, la méthode d'initialisation de l'objet ne sera pas appelée. Par exemple :
class Mycls: def __new__(cls): print('new') return super().__new__(cls) def __init__(self): print('init') my=Mycls()
Sortie :
Nous pouvons voir que new est affiché avant init, prouvant que __new__(cls) est exécuté avant __init__(self).
Nous réécrivons le code :
def __new__(cls): print('new') my=Mycls() print(my)
Sortie :
Vous pouvez voir que s'il n'y a pas de valeur de retour dans __new__(cls):, l'instance ne sera pas renvoyée, et __init__(self ) ne sera pas exécuté.
1. La méthode __new__() est utilisée pour créer une instance. Elle sera appelée en premier avant que la classe ne soit instanciée. La méthode __init__() est utilisée pour initialiser l'instance. Cette méthode est appelée après la création de l'objet instance et est utilisée pour définir certaines valeurs initiales de l'objet instance de classe.
2. Si la méthode __init__() et la méthode __new__() apparaissent dans la classe, la méthode __new__() sera appelée en premier, puis la méthode __init__(). La méthode __new__() est la première étape de la création d'une instance. Après l'exécution, l'instance de la classe créée doit être renvoyée. Sinon, une erreur sera signalée et la méthode __init__() ne pourra pas être exécutée. Parmi eux, la méthode __init__() ne renverra aucune information.
Certains étudiants se demanderont que peut-on réaliser avec __new__ ?
Personnellement, je pense que singleton est l'application la plus classique. Singleton Pattern est un modèle de conception logicielle couramment utilisé. L'objectif principal de ce modèle est de garantir qu'une seule instance d'une certaine classe existe. Les objets Singleton sont utiles lorsque nous souhaitons qu'une seule instance d'une certaine classe apparaisse dans l'ensemble du système. Par exemple, il peut y avoir plusieurs tâches d'impression dans un système, mais il ne peut y avoir qu'une seule tâche de travail ; un système ne peut avoir qu'un seul gestionnaire de fenêtres ou système de fichiers ; un système ne peut avoir qu'un seul outil de synchronisation ou générateur d'ID (numéro de série).
Le code d'implémentation spécifique est le suivant :
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)
Sortie :
init <__main__.Mycls object at 0x000000406E471148> Init <__main__.Mycls object at 0x000000406E471148>
Vous pouvez voir que bien qu'ils s'appellent my1 et my2, ce sont tous deux des objets 0x000000406E471148. C'est l'application du mode singleton.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!