Heim  >  Fragen und Antworten  >  Hauptteil

[Python-Neuling] Stellen Sie eine Frage zur Funktion der __new__-Methode

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 Ein laufendes Ergebnis:

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()

Code B Laufergebnis:

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()

Code C-Laufergebnis:

Meine Frage eins:
Warum geben diese drei Codeteile A, B und C unterschiedliche Ergebnisse aus? Insbesondere Code B und Code C, warum fügt Code C eine Rückgabe auf Basis von B hinzu und das Ergebnis ist eine Init-Methode mehr als B?
Meine Frage 2:
Was ist der Unterschied zwischen den beiden Parametern self und cls bei der Parameterübergabe an die Methode? Warum benötigt die Methode __new__ cls als Parameter und die Methode __init__ self?

phpcn_u1582phpcn_u15822669 Tage vor589

Antworte allen(1)Ich werde antworten

  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-28 09:26:55

    首先得先明白一件事情: selfcls的区别, cls是代表这个类, slef是用来代表这个类的实例, 如果这个搞清楚, 就成功了一点.

    函数参数带有self的, 可以理解成这个函数, 是实例的方法, 是要和实例绑定的.

    __new__方法, 是新式类用来创建实例使用的, 传入的cls就是用来给object.__new__创建实例使用的参数, 如果没有传入cls, object根本不知道创建什么样的实例.

    结合上面, 现在再来说下三个输出不同的原因:

    1. 为什么只有--new, 因为每个类在实例化对象时, 都必须要调用这个__new__方法, 去创建实例, 所以它肯定会被调用, 但是因为该函数被你重写了, 所以它只是打印了--new方法, 并没有返回创建实例, 并且放回, 所以__del__也是不会发生

    2. 为什么只有--new和--del, 正如第1点说的那样, 但是这里确实__new___有创建新实例, 但是并没有返回, 因为只有返回了, 该对象才能进行下一步的__init__, 正因为这里只有创建, 没有返回, 所以结果这样

    3. 如果看懂前两点, 相信这个应该没啥问题, 因为创建了,并且返回了, 所以'__init__'也同样被执行了, 所有的东西都是像正常的行为那样发生

    最后想说明: 为什么__del__会被执行, 理论上, 这个只有在实例被del析构时, 才会执行,这里并没有del xtq类似的代码, 为什么也会执行, 原因就是, 程序结束了, 要退出了, 在执行更底层的程序退出时, python自发做的内存回收, 所以一切尘归尘土归土, 创建的对象也被一一析构

    Antwort
    0
  • StornierenAntwort