Tôi có một lớp chỉ định một tập hợp các chức năng gọi lại (được hiển thị ở đây là cb1
và cb2
). Tôi giữ một bản đồ của những thứ mà tôi muốn gọi sau một số sự kiện.Tham chiếu Python để gọi lại trong từ điển
class Foo:
cb1 = None
cb2 = None
def test(self, input):
for (name, callback) in map:
if name == input:
if callback: callback()
...
map = {'one':cb1, 'two':cb2}
def mycallback():
print "mycallback()"
f = Foo()
f.cb1 = mycallback # Register our callback
f.test('one') # Nothing happens
Bạn có thể phát hiện sự cố không?
gì xảy ra, là khi các lớp được khởi tạo, giá trị của cb1
và cb2
(trong đó có cả None
) được copy vào bản đồ. Vì vậy, ngay cả sau khi người dùng 'đăng ký' cuộc gọi lại (bằng cách gán cho cb1
), giá trị trong bản đồ vẫn là None
và không có gì được gọi.
Vì không có thứ như 'bằng cách tham chiếu' bằng Python, làm cách nào để khắc phục điều này?
nitpick: tất cả mọi thứ được truyền bằng cách tham khảo 'bằng Python. Nhưng nó bằng cách tham chiếu, không phải bởi * name *: nếu bạn rebind tên cho đối tượng khác, điều đó không cập nhật các tham chiếu khác cho bất kỳ tên nào trỏ đến. –