[Python Newbie] Posez une question sur la fonction de la méthode __new__
phpcn_u1582
phpcn_u1582 2017-06-28 09:24:55
0
1
610

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 ?

phpcn_u1582
phpcn_u1582

répondre à tous(1)
过去多啦不再A梦

Tout d'abord, vous devez comprendre une chose : selfcls的区别, 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, objectJe 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 :

  1. 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 plus

  2. Pourquoi 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 ça

  3. Si 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类似的代码, 为什么也会执行, 原因就是, 程序结束了, 要退出了, 在执行更底层的程序退出时, pythonon 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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal