Vì nó là kiến thức phổ biến của python __del__
phương pháp không nên được sử dụng để làm sạch những điều quan trọng, vì nó không được đảm bảo phương pháp này được gọi là. Cách khác là sử dụng trình quản lý ngữ cảnh, như được mô tả trong một số chủ đề.Cách sử dụng trình quản lý ngữ cảnh để tránh sử dụng __del__ trong python?
Nhưng tôi không hoàn toàn hiểu cách viết lại một lớp để sử dụng trình quản lý ngữ cảnh. Để xây dựng, tôi có một ví dụ đơn giản (không làm việc) trong đó một lớp trình bao bọc sẽ mở và đóng một thiết bị, và sẽ đóng thiết bị trong mọi trường hợp thể hiện của lớp nằm ngoài phạm vi của nó (ngoại trừ vv).
Các tập tin đầu tiên mydevice.py
là một lớp wrapper tiêu chuẩn để mở và đóng một thiết bị:
class MyWrapper(object):
def __init__(self, device):
self.device = device
def open(self):
self.device.open()
def close(self):
self.device.close()
def __del__(self):
self.close()
lớp này được sử dụng bởi một lớp myclass.py
:
import mydevice
class MyClass(object):
def __init__(self, device):
# calls open in mydevice
self.mydevice = mydevice.MyWrapper(device)
self.mydevice.open()
def processing(self, value):
if not value:
self.mydevice.close()
else:
something_else()
Câu hỏi của tôi: Khi tôi thực hiện quản lý ngữ cảnh trong mydevice.py
với các phương thức __enter__
và __exit__
, cách lớp này có thể được xử lý trong myclass.py
? Tôi cần phải làm điều gì đó như
def __init__(self, device):
with mydevice.MyWrapper(device):
???
nhưng cách xử lý? Có lẽ tôi đã bỏ qua một cái gì đó quan trọng? Hoặc tôi có thể sử dụng một trình quản lý ngữ cảnh chỉ trong một hàm và không phải là một biến bên trong một phạm vi lớp?
Nhận xét giống như trước: Tôi không biết trước điều gì sẽ xảy ra với thiết bị nhưng nó sẽ được mở và sử dụng trong một số phương thức, lớp học khác ... Đó có phải là trường hợp tôi vẫn nên sử dụng '__del__' thay thế không? – Alex
Tôi nghĩ rằng '__del __()' là của bạn chỉ mở cho hành vi mở này kết thúc. Hãy nhớ rằng '__del __()' chỉ không được gọi nếu bộ thu gom rác tìm thấy một chu trình tham chiếu liên quan đến lớp của bạn. Bạn thậm chí có thể phát hiện và giải quyết điều này theo cách thủ công trong mã của mình bằng cách kiểm tra định kỳ ['gc.garbage'] (http://docs.python.org/2/library/gc.html#gc.garbage) và phá vỡ các chu kỳ tham chiếu đang gây ra sự cố. – Cartroo