Rumah > Soal Jawab > teks badan
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?
过去多啦不再A梦2017-06-28 09:26:55
Pertama sekali, anda mesti faham satu perkara: self
和cls
的区别, 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
, object
Saya tidak tahu jenis contoh yang hendak dibuat sama sekali.
Digabungkan dengan perkara di atas, mari kita bincangkan tentang tiga sebab mengapa output berbeza:
Mengapa hanya --baru Kerana setiap kelas mesti memanggil ini apabila menginstant objek__new__
方法, 去创建实例, 所以它肯定会被调用, 但是因为该函数被你重写了, 所以它只是打印了--new方法
, 并没有返回创建实例, 并且放回, 所以__del__
Ia juga tidak akan berlaku
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
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
类似的代码, 为什么也会执行, 原因就是, 程序结束了, 要退出了, 在执行更底层的程序退出时, python
kita secara spontan melakukan kitar semula ingatan, jadi semuanya kembali menjadi debu, dan objek yang dicipta juga dimusnahkan satu demi satu