Rumah  >  Soal Jawab  >  teks badan

[Python Newbie] Tanya soalan tentang fungsi kaedah __new__

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

Kod A hasil larian:

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

Hasil larian kod B:

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

Hasil larian kod C:

Soalan saya satu:
Mengapa ketiga-tiga keping kod A, B, dan C ini mengeluarkan hasil yang berbeza Apakah prinsipnya? Terutamanya kod B dan kod C, mengapa kod C menambah pulangan berdasarkan B, dan hasilnya adalah satu lagi kaedah init daripada B.
Soalan saya 2:
Apakah perbezaan antara dua parameter sendiri dan cls apabila menghantar parameter kepada kaedah? Mengapakah kaedah __new__ memerlukan cls sebagai parameter dan kaedah __init__ memerlukan diri?

phpcn_u1582phpcn_u15822670 hari yang lalu590

membalas semua(1)saya akan balas

  • 过去多啦不再A梦

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

    Pertama sekali, anda mesti faham satu perkara: selfcls的区别, cls是代表这个类, slef是用来代表这个类的实例, jika anda faham ini, anda akan berjaya.

    Parameter fungsi dengan self boleh difahami sebagai fungsi ini, yang merupakan kaedah contoh dan terikat pada contoh.

    __new__方法, 是新式类用来创建实例使用的, 传入的cls就是用来给object.__new__创建实例使用的参数, 如果没有传入cls, objectSaya tidak tahu jenis contoh yang hendak dibuat sama sekali.

    Digabungkan dengan perkara di atas, mari kita bincangkan tentang tiga sebab mengapa output berbeza:

    1. Mengapa hanya --baru Kerana setiap kelas mesti memanggil ini apabila menginstant objek__new__方法, 去创建实例, 所以它肯定会被调用, 但是因为该函数被你重写了, 所以它只是打印了--new方法, 并没有返回创建实例, 并且放回, 所以__del__Ia juga tidak akan berlaku

    2. Kenapa hanya ada --baru dan --del, seperti yang disebut dalam point 1, tetapi di sini memang ada __new___有创建新实例, 但是并没有返回, 因为只有返回了, 该对象才能进行下一步的__init__, tepatnya kerana hanya ada penciptaan dan tiada pulangan, jadi hasilnya seperti ini

    3. Jika anda memahami dua perkara pertama, saya percaya tidak ada masalah dengan ini, kerana ia dicipta dan dikembalikan, jadi '__init__' juga dilaksanakan, dan semuanya berlaku seperti tingkah laku biasa

    Akhir sekali, saya ingin menerangkan: Mengapa __del__会被执行, 理论上, 这个只有在实例被del析构时, 才会执行,这里并没有del xtq类似的代码, 为什么也会执行, 原因就是, 程序结束了, 要退出了, 在执行更底层的程序退出时, pythonkita secara spontan melakukan kitar semula ingatan, jadi semuanya kembali menjadi debu, dan objek yang dicipta juga dimusnahkan satu demi satu

    balas
    0
  • Batalbalas