ฉันขอแนะนำให้ใช้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