Membersihkan Objek Python Dengan Betul
Kaedah __del__() sering digunakan untuk membersihkan sumber apabila objek Python dimusnahkan. Walau bagaimanapun, bergantung pada __del__() boleh menjadi masalah kerana sistem pengumpulan sampah Python, yang tidak menjamin kewujudan "pembolehubah global" semasa __del__() invocation.
Untuk memastikan pembersihan objek yang betul, disyorkan untuk gunakan pernyataan Python dengan. Pernyataan with mengambil contoh kelas sebagai hujahnya dan menjamin bahawa kaedah __enter__() kelas dipanggil semasa masuk dan kaedah __exit__() dipanggil semasa keluar, tanpa mengira pengecualian.
Pertimbangkan kelas pakej berikut:
<code class="python">class Package: def __init__(self): self.files = [] # ... def __del__(self): for file in self.files: os.unlink(file)</code>
Kaedah __del__() cuba mengalih keluar semua fail kepunyaan pakej. Walau bagaimanapun, ia mungkin gagal kerana tiada rujukan kepada self.files. Untuk menyelesaikan masalah ini, tentukan kaedah __enter__() dan __exit__() seperti berikut:
<code class="python">class Package: def __init__(self): self.files = [] def __enter__(self): return self # ... def __exit__(self, exc_type, exc_value, traceback): for file in self.files: os.unlink(file)</code>
Sekarang, apabila menggunakan kelas Pakej dengan pernyataan dengan:
<code class="python">with Package() as package_obj: # use package_obj</code>
__enter__() ialah dipanggil semasa masuk dan __exit__() dijamin dipanggil semasa keluar, memastikan pembersihan fail yang betul walaupun dengan adanya pengecualian.
Untuk mengelakkan instantiasi langsung secara tidak sengaja bagi kelas Pakej tanpa menggunakan pernyataan dengan, pertimbangkan untuk mencipta Kelas PackageResource dengan kaedah __enter__() dan __exit__():
<code class="python">class PackageResource: def __enter__(self): class Package: ... self.package_obj = Package() return self.package_obj def __exit__(self, exc_type, exc_value, traceback): self.package_obj.cleanup()</code>
Dengan pendekatan ini, kelas Pakej hanya boleh digunakan dalam pernyataan dengan:
<code class="python">with PackageResource() as package_obj: # use package_obj</code>
Atas ialah kandungan terperinci Bagaimana untuk Memastikan Pembersihan Objek yang Betul dalam Python: Adakah `__del__()` Cukup?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!