Code A :
# -*- coding:gb2312 -*-
class Dog (object):
def __init__(self):
print("-----init方法-----")
def __del__(self):
print("-----del方法-----")
def __str__(self):
#print("-----str方法-----")
return ("-----str方法-----")
def __new__(cls):
print("-----new方法-----")
#return object.__new__(cls)
xtq = Dog()
Code A résultat en cours d'exécution :
Code B :
# -*- coding:gb2312 -*-
class Dog (object):
def __init__(self):
print("-----init方法-----")
def __del__(self):
print("-----del方法-----")
def __str__(self):
#print("-----str方法-----")
return ("-----str方法-----")
def __new__(cls):
print("-----new方法-----")
object.__new__(cls)
xtq = Dog()
Résultat de course Code B :
Code C :
# -*- coding:gb2312 -*-
class Dog (object):
def __init__(self):
print("-----init方法-----")
def __del__(self):
print("-----del方法-----")
def __str__(self):
#print("-----str方法-----")
return ("-----str方法-----")
def __new__(cls):
print("-----new方法-----")
return object.__new__(cls)
xtq = Dog()
Résultat d'exécution du Code C :
Ma première question :
Pourquoi ces trois morceaux de code A, B et C génèrent-ils des résultats différents ? Quel est le principe ? Surtout le code B et le code C, pourquoi le code C ajoute-t-il un retour sur la base de B, et le résultat est une méthode d'initialisation de plus que B.
Ma question 2 :
Quelle est la différence entre les deux paramètres self et cls lors du passage des paramètres à la méthode ? Pourquoi la méthode __new__ nécessite-t-elle cls comme paramètre et la méthode __init__ nécessite-t-elle self ?
Tout d'abord, vous devez comprendre une chose :
self
和cls
的区别,cls
是代表这个类
,slef
是用来代表这个类的实例
, si vous comprenez cela, vous réussirez.Les paramètres de fonction avec
self
peuvent être compris comme cette fonction, qui est une méthode d'instance et est liée à l'instance.__new__
方法, 是新式类用来创建实例使用的, 传入的cls
就是用来给object.__new__
创建实例使用的参数, 如果没有传入cls
,object
Je ne sais pas du tout quel type d’instance créer.En combinaison avec ce qui précède, parlons des trois raisons pour lesquelles le résultat est différent :
Pourquoi seulement --new Parce que chaque classe doit appeler cela lors de l'instanciation d'un objet
__new__
方法, 去创建实例, 所以它肯定会被调用, 但是因为该函数被你重写了, 所以它只是打印了--new方法
, 并没有返回创建实例, 并且放回, 所以__del__
Cela n'arrivera pas non plusPourquoi n'y a-t-il que --new et --del, comme mentionné au point 1, mais le voici bien
__new___
有创建新实例, 但是并没有返回, 因为只有返回了, 该对象才能进行下一步的__init__
, justement parce qu'il n'y a que création et pas de retour, donc le résultat est comme çaSi vous comprenez les deux premiers points, je pense que cela ne devrait poser aucun problème, car il est créé et renvoyé, donc '__init__' est également exécuté, et tout se passe normalement
Enfin, je voudrais expliquer : Pourquoi
__del__
会被执行, 理论上, 这个只有在实例被del
析构时, 才会执行,这里并没有del xtq
类似的代码, 为什么也会执行, 原因就是, 程序结束了, 要退出了, 在执行更底层的程序退出时,python
on fait spontanément du recyclage de mémoire, pour que tout retourne en poussière, et les objets créés sont aussi détruits un à un