ฉันขอแนะนำให้ใช้with
คำสั่งPython สำหรับการจัดการทรัพยากรที่จำเป็นต้องทำความสะอาด ปัญหาเกี่ยวกับการใช้close()
คำสั่งที่ชัดเจนคือคุณต้องกังวลเกี่ยวกับคนที่ลืมโทรเลยหรือลืมวางไว้ในfinally
บล็อกเพื่อป้องกันการรั่วไหลของทรัพยากรเมื่อมีข้อยกเว้นเกิดขึ้น
ในการใช้with
คำสั่งให้สร้างคลาสด้วยวิธีการต่อไปนี้:
def __enter__(self)
def __exit__(self, exc_type, exc_value, traceback)
ในตัวอย่างด้านบนคุณจะใช้
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)
จากนั้นเมื่อมีคนต้องการใช้คลาสของคุณพวกเขาจะทำสิ่งต่อไปนี้:
with Package() as package_obj:
# use package_obj
ตัวแปร package_obj จะเป็นตัวอย่างของประเภทแพคเกจ (มันเป็นค่าที่ส่งกลับโดย__enter__
วิธีการ) __exit__
วิธีการของมันจะถูกเรียกโดยอัตโนมัติไม่ว่าจะมีข้อยกเว้นเกิดขึ้นหรือไม่
คุณสามารถใช้แนวทางนี้อีกก้าวหนึ่ง ในตัวอย่างข้างต้นบางคนอาจจะยังคง instantiate แพคเกจโดยใช้ตัวสร้างได้โดยไม่ต้องใช้with
ประโยค คุณไม่ต้องการที่จะเกิดขึ้น คุณสามารถแก้ไขได้โดยสร้างคลาส PackageResource ที่กำหนด__enter__
และ__exit__
วิธีการ จากนั้นคลาสแพ็กเกจจะถูกกำหนดอย่างเคร่งครัดภายใน__enter__
เมธอดและส่งคืน ด้วยวิธีนี้ผู้เรียกจะไม่สามารถยกระดับคลาสแพ็คเกจได้โดยไม่ต้องใช้with
คำสั่ง
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()
คุณจะใช้สิ่งนี้ดังนี้:
with PackageResource() as package_obj:
# use package_obj