Bagaimana untuk Memastikan Pembersihan Sumber dalam Objek Python: __del__ lwn. Penyata `dengan`?

Mary-Kate Olsen
Lepaskan: 2024-10-27 10:36:30
asal
303 orang telah melayarinya

 How to Ensure Resource Cleanup in Python Objects: __del__ vs. `with` Statement?

Melepaskan Sumber dalam Objek Python Dengan Selamat

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)
Salin selepas log masuk

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)
Salin selepas log masuk

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()
Salin selepas log masuk

Penggunaan:

with PackageResource() as package_obj:
    # use package_obj
Salin selepas log masuk

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!

sumber:php.cn
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
Artikel terbaru oleh pengarang
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!