Dalam Python, objek boleh dibersihkan menggunakan kaedah __del__. Walau bagaimanapun, terdapat had untuk kaedah ini, kerana ia bergantung pada kewujudan pembolehubah global semasa pelaksanaannya.
Pertimbangkan contoh berikut:
class Package: def __init__(self): self.files = [] # ... def __del__(self): for file in self.files: os.unlink(file)
Kaedah __del__ ini bertujuan untuk memadam fail diberikan kepada senarai fail. Walau bagaimanapun, ia mungkin gagal dengan pengecualian AttributeError kerana pembolehubah global (dalam kes ini, self.files) mungkin tidak wujud lagi apabila __del__ dipanggil.
Untuk membersihkan objek dengan pasti, Python mengesyorkan menggunakan pernyataan with. Pernyataan with menyediakan pengurus konteks yang boleh mengendalikan peruntukan sumber dan pembersihan secara automatik.
Begini cara anda boleh melaksanakan pembersihan menggunakan pernyataan with:
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)
Dalam contoh ini, kaedah __enter__ mengembalikan contoh kelas Pakej, yang diberikan kepada pembolehubah (cth., package_obj) apabila digunakan dengan pernyataan dengan. Kaedah __exit__ dipanggil selepas blok dengan, tidak kira sama ada pengecualian berlaku.
Selain itu, anda boleh meningkatkan pendekatan ini dengan mencipta kelas pengurusan sumber yang membungkus kelas sasaran dan menyediakan kaedah __enter__ dan __exit__. Ini memastikan bahawa kelas sasaran hanya boleh dibuat seketika dengan pernyataan dengan.
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()
Penggunaan:
with PackageResource() as package_obj: # use package_obj
Teknik ini memastikan pembersihan dilakukan dengan betul, walaupun apabila pengecualian berlaku atau kelas sasaran dibuat seketika tanpa menggunakan pernyataan dengan.
Atas ialah kandungan terperinci Bagaimana untuk Memastikan Pembersihan Sumber dalam Objek Python: __del__ lwn. Penyata `dengan`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!