Tôi đang làm việc trong Python 2.7 và tôi thích vấn đề đó khiến tôi khó hiểu.Tại sao thiết lập một phương pháp ràng buộc đối tượng python tạo tham chiếu vòng tròn?
Đó là ví dụ đơn giản nhất:
>>> class A(object):
def __del__(self):
print("DEL")
def a(self):
pass
>>> a = A()
>>> del a
DEL
Đó là OK như mong đợi ... bây giờ tôi đang cố gắng để thay đổi phương pháp a()
của đối tượng a
và những gì xảy ra là sau khi thay đổi nó, tôi không thể xóa a
nữa:
>>> a = A()
>>> a.a = a.a
>>> del a
Chỉ cần làm một số kiểm tra tôi đã in a.a
tham khảo trước và sau khi chuyển nhượng
>>> a = A()
>>> print a.a
<bound method A.a of <__main__.A object at 0xe86110>>
>>> a.a = a.a
>>> print a.a
<bound method A.a of <__main__.A object at 0xe86110>>
Cuối cùng tôi đã sử dụng objgraph
module để cố gắng tìm hiểu tại sao các đối tượng không được giải phóng:
>>> b = A()
>>> import objgraph
>>> objgraph.show_backrefs([b], filename='pre-backref-graph.png')
>>> b.a = b.a
>>> objgraph.show_backrefs([b], filename='post-backref-graph.png')
Như bạn có thể nhìn thấy trong post-backref-graph.png
hình ảnh có là một tài liệu tham khảo __self__
trong b mà không có ý nghĩa đối với tôi vì tự r eferences của phương pháp dụ nên được bỏ qua (như trước khi phân công).
Ai đó có thể giải thích lý do hành vi đó và cách tôi có thể giải quyết nó?
Ok ... Có cách nào để tránh điều đó? Tôi nên cache một số phương thức và khôi phục lại phương thức sau: có khả thi không? –
Nó phụ thuộc vào những gì bạn đang cố gắng làm. – Veedrac
OK Tôi tìm thấy giải pháp: aa = types.MethodType (Aa, a, A) –