如果python的类方法对象继承了一个__call__方法来拦截运行,python的类实例对象依然可以调用,只因为如此,我们可以传递其中一个作为回调处理器,例如:
from tkinter import *
class HelloCallable:
def __init__(self):
self.msg = 'hello __call__ world'
def __call__(self):
print(self.msg)
sys.exit()
widge = Button(None, text='hello event world',command=HelloCallable())
widge.pack()
widge.mainloop()
这里command注册的HelloCallable实例可以像一个普通函数那样被调用。按钮按下,python会启动__call__方法来处理tkinter内部的调用操作。实际上,例子中的__call__方法会替换一个具体的bound方法。注意这里的self.msg是如何来保存时间的信息。当具体的__call__方法启动时,self是最初的实例。