Tôi đang sử dụng một __del__()
của đối tượng để bỏ đăng ký nó từ một sự kiện (sử dụng một chương trình sự kiện tương tự như this):Không thể tham khảo một module nhập khẩu __del __()
import my_enviroment
class MyClass():
def __del__(self):
my_environment.events.my_event -= self.event_handler_func
Nhưng kỳ lạ tôi nhận được lỗi sau tại khi kết thúc chương trình chạy:
Exception AttributeError: "'NoneType' object has no attribute 'events'" in <bound method MyClass.__del__ of <myclass.MyClass instance at 0x04C54580>> ignored
Làm sao điều này có thể xảy ra ?! my_environment
là một mô-đun tôi đã nhập, làm thế nào đến nó có thể là Không? (events
là một đối tượng toàn cầu trong đó có sự kiện móc như my_event
)
Điều này thường được gọi như thế nào (ngoài việc chấm dứt chương trình)? Liệu trình xử lý sự kiện có giữ một tham chiếu đến đối tượng sẽ ngăn không cho nó bị thu gom rác không? – interjay
@interjay - Một số đối tượng MyClass sống trong suốt thời gian chạy và một số ngắn ngủi. Tôi đã thêm sự kiện dọn dẹp này cho trường hợp sau này. – Jonathan
Điểm của tôi là điều này sẽ không bao giờ được gọi cho các đối tượng ngắn ngủi vì trình xử lý sự kiện giữ một tham chiếu đến chúng. – interjay