Soalan lazim temu bual Python: Perbezaan antara __Init__ dan __New__

PHPz
Lepaskan: 2023-04-12 14:31:06
ke hadapan
1429 orang telah melayarinya

Soalan lazim temu bual Python: Perbezaan antara __Init__ dan __New__

Kaedah yang ditakrifkan dalam kelas Python dan berakhir dengan _ _ xx _ _ semuanya kaedah terbina dalam kelas, juga dipanggil kaedah ajaib. Kaedah terbina dalam kelas

akan dicetuskan secara automatik apabila syarat tertentu dipenuhi Di sini kami memberi tumpuan kepada menerangkan __init__ dan __new__, yang berkaitan dengan penciptaan instance.

Penerangan ringkas tentang __init__

__init__(self): Kami agak biasa dengan kaedah ini ialah kaedah permulaan lalai dalam kelas Python, iaitu kaedah yang akan dilaksanakan apabila a kelas dibuat seketika.

Penjelasan terperinci tentang __new__

__penulisan semula kaedah__baru sangat tetap, biasanya seperti berikut:

def __new__(cls):
return super().__new__(cls)
Salin selepas log masuk

di mana cls mewakili kelas itu sendiri.

Kod untuk menulis semula kaedah __new__ sangat tetap: apabila menulis semula kaedah __new__, anda mesti mengembalikan super().__new__(cls), atau mengembalikan objek.__new__(cls), jika tidak, penterjemah python tidak akan Untuk merujuk objek dengan ruang yang diperuntukkan, kaedah permulaan objek tidak akan dipanggil. Contohnya:

class Mycls:
def __new__(cls):
 print('new')
 return super().__new__(cls)
def __init__(self):
print('init')
my=Mycls()
Salin selepas log masuk

Output:

  • baharu
  • init

Kita dapat melihat bahawa baru adalah output sebelum init, membuktikan __new__(cls) dilaksanakan sebelum __init__(self).

Kami menulis semula kod:

def __new__(cls):
 print('new')
my=Mycls()
print(my)
Salin selepas log masuk

Output:

  • baharu
  • Tiada

Anda boleh lihat Jika tiada nilai pulangan dalam __new__(cls):, instance tidak akan dikembalikan dan __init__(self) tidak akan dilaksanakan.

Ringkasan __new__ dan __init__

1. Kaedah __new__() digunakan untuk membuat contoh terlebih dahulu sebelum kelas itu adalah kaedah kelas dan statik kaedah. Kaedah __init__() digunakan untuk memulakan contoh Kaedah ini dipanggil selepas objek contoh dibuat. Ia adalah kaedah objek contoh dan digunakan untuk menetapkan beberapa nilai awal objek contoh kelas.

2. Jika kaedah __init__() dan kaedah __new__() muncul dalam kelas pada masa yang sama, kaedah __new__() akan dipanggil dahulu dan kemudian kaedah __init__(). Kaedah __new__() ialah langkah pertama dalam mencipta contoh Selepas pelaksanaan, contoh kelas yang dibuat perlu dikembalikan. Antaranya, kaedah __init__() tidak akan mengembalikan sebarang maklumat.

Aplikasi __new__

Sesetengah pelajar akan bertanya apakah yang boleh dicapai dengan __new__?

Secara peribadi, saya rasa singleton ialah aplikasi paling klasik. Singleton Pattern ialah corak reka bentuk perisian yang biasa digunakan Tujuan utama corak ini adalah untuk memastikan hanya satu contoh kelas tertentu wujud. Objek singleton berguna apabila kita mahu hanya satu contoh kelas tertentu muncul dalam keseluruhan sistem. Sebagai contoh, terdapat beberapa tugas pencetakan dalam sistem, tetapi hanya terdapat satu tugas yang berfungsi; sistem hanya boleh mempunyai satu pengurus tetingkap atau sistem fail;

Kod pelaksanaan khusus adalah seperti berikut:

class Mycls:
_instance = None
 def __new__(cls):
 # 判断该类的属性是否为空;对第一个对象没有被创建,我们应该调用父类的方法,为第一个对象分配空间
 if cls._instance == None:
 # 把类属性中保存的对象引用返回给python的解释器
cls._instance = object.__new__(cls)
return cls._instance
# 如果cls._instance不为None,直接返回已经实例化了的实例对象
else:
return cls._instance
def __init__(self):
print('init')
my1=Mycls()
print(my1)
my2=Mycls()
print(my2)
Salin selepas log masuk

Output:

init
<__main__.Mycls object at 0x000000406E471148>
Init
<__main__.Mycls object at 0x000000406E471148>
Salin selepas log masuk

Anda boleh melihat bahawa walaupun ia dipanggil my1 dan my2, kedua-duanya adalah objek 0x000000406E471148 Ini ialah aplikasi Contoh tunggal.

Atas ialah kandungan terperinci Soalan lazim temu bual Python: Perbezaan antara __Init__ dan __New__. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:51cto.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!