Questions fréquemment posées sur l'entretien Python : la différence entre __Init__ et __New__

PHPz
Libérer: 2023-04-12 14:31:06
avant
1413 Les gens l'ont consulté

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.

Brève description de __init__

__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.

L'explication détaillée de la réécriture de la méthode __new__

__new__ est très fixe, généralement comme suit :

def __new__(cls):
return super().__new__(cls)
Copier après la connexion

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()
Copier après la connexion

Sortie :

  • new
  • init

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)
Copier après la connexion

Sortie :

  • new
  • Aucun

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é.

__new__ et __init__ résumé

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.

Application de __new__

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)
Copier après la connexion

Sortie :

init
<__main__.Mycls object at 0x000000406E471148>
Init
<__main__.Mycls object at 0x000000406E471148>
Copier après la connexion

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!

Étiquettes associées:
source:51cto.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!