Saya akan merekomendasikan menggunakan with
pernyataan Python untuk mengelola sumber daya yang perlu dibersihkan. Masalah dengan menggunakan close()
pernyataan eksplisit adalah Anda harus khawatir tentang orang yang lupa menyebutnya sama sekali atau lupa menempatkannya di finally
blok untuk mencegah kebocoran sumber daya ketika pengecualian terjadi.
Untuk menggunakan with
pernyataan, buat kelas dengan metode berikut:
def __enter__(self)
def __exit__(self, exc_type, exc_value, traceback)
Dalam contoh Anda di atas, Anda akan menggunakan
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)
Kemudian, ketika seseorang ingin menggunakan kelas Anda, mereka akan melakukan hal berikut:
with Package() as package_obj:
# use package_obj
Variabel package_obj akan menjadi turunan dari tipe Paket (ini adalah nilai yang dikembalikan oleh __enter__
metode). Its __exit__
metode secara otomatis akan dipanggil, terlepas dari apakah atau tidak pengecualian terjadi.
Anda bahkan bisa mengambil pendekatan ini selangkah lebih maju. Pada contoh di atas, seseorang masih dapat membuat Instantiate menggunakan konstruktornya tanpa menggunakan with
klausa. Anda tidak ingin itu terjadi. Anda bisa memperbaikinya dengan membuat kelas PackageResource yang mendefinisikan __enter__
dan __exit__
metode. Kemudian, kelas Paket akan didefinisikan secara ketat di dalam __enter__
metode dan dikembalikan. Dengan begitu, penelepon tidak pernah dapat membuat instance kelas Paket tanpa menggunakan with
pernyataan:
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()
Anda akan menggunakan ini sebagai berikut:
with PackageResource() as package_obj:
# use package_obj