回調(diào)函數(shù)用起來(lái)比較爽。特別是在js中,滿(mǎn)世界全是回調(diào),那么在python中,怎么來(lái)優(yōu)雅地實(shí)現(xiàn)自己的回調(diào)函數(shù)呢
下面貼一個(gè)我寫(xiě)的例子
class BaseHandler(object):  def crawl(self, url, **kwargs):    if kwargs.get('callback'):      callback = kwargs['callback']      if isinstance(callback, basestring) and hasattr(self, callback):        func = getattr(self, callback)      elif hasattr(callback, 'im_self') and callback.im_self is self:        func = callback    resp = requests.get(url)    return func(resp)class Anjuke(BaseHandler):  def on_start(self):    self.crawl(start_url, callback=self.index_url)  def index_url(self, response):    print response.texta = Anjuke()print a.on_start()其實(shí)就是通過(guò)kwargs獲取到callback的對(duì)象/字符串,然后通過(guò)getattr(self, callback)來(lái)反射得到回調(diào)的方法,然后調(diào)用即可。
接著可以進(jìn)一步抽象,增加回調(diào)方法的復(fù)用,于是BaseHandler可以改寫(xiě)成裝飾器方式
def callback(f):  def wrapper(obj, *args, **kwargs):    resp = f(obj, *args, **kwargs)    if kwargs.get('callback'):      mcallback = kwargs['callback']      if isinstance(callback, basestring) and hasattr(obj, mcallback):        func = getattr(obj, mcallback)      elif hasattr(mcallback, 'im_self') and mcallback.im_self is obj:        func = mcallback        kwargs['callback'] = func.__name__      else:        raise NotImplementedError("self.%s() not implemented!" % callback)    return func(resp)  return wrapperclass BaseHandler(object):  @callback  def crawl(self, url, **kwargs):    url = quote_chinese(_build_url(url.strip(), kwargs.get('params')))    return requests.get(url)                                                                                    
新聞熱點(diǎn)
疑難解答
圖片精選