我有一個類指定了一組回調函數(這裏顯示爲cb1
和cb2
)。我保留了一些我想在某些事件後致電的地圖。在字典中回調的Python引用
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
你能發現問題嗎?
會發生什麼情況,是當類被初始化時,值cb1
和cb2
(這兩者都是None
)被複制到地圖。因此,即使用戶「註冊」了回撥(通過分配給cb1
),地圖中的值仍然是None
,並且不會調用任何內容。
由於在Python中沒有像'引用'那樣的東西,我該如何解決這個問題?
雞蛋裏挑骨頭:一切「引用」在Python通過。但它是通過引用,而不是* name *:如果您將該名稱重新綁定到另一個對象,則不會更新其他引用以指向任何名稱。 –