最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python構(gòu)建自定義回調(diào)函數(shù)詳解

 更新時間:2017年06月20日 08:51:03   作者:李雷雷alexkn  
在工作中,回調(diào)函數(shù)使用的場景是非常多的,下面我們就來通過例子程序來詳細(xì)了解利用了Python的屬性機制構(gòu)建了一個自定義回調(diào)函數(shù)的使用

回調(diào)函數(shù)用起來比較爽。特別是在js中,滿世界全是回調(diào),那么在python中,怎么來優(yōu)雅地實現(xiàn)自己的回調(diào)函數(shù)呢

下面貼一個我寫的例子

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.text

a = Anjuke()
print a.on_start()

其實就是通過kwargs獲取到callback的對象/字符串,然后通過getattr(self, callback)來反射得到回調(diào)的方法,然后調(diào)用即可。

接著可以進一步抽象,增加回調(diào)方法的復(fù)用,于是BaseHandler可以改寫成裝飾器方式

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 wrapper


class BaseHandler(object):

  @callback
  def crawl(self, url, **kwargs):
    url = quote_chinese(_build_url(url.strip(), kwargs.get('params')))
    return requests.get(url)

相關(guān)文章

  • python項目運行導(dǎo)致內(nèi)存越來越大的原因詳析

    python項目運行導(dǎo)致內(nèi)存越來越大的原因詳析

    最近在跑python程序時,出現(xiàn)占用的內(nèi)存不斷增加的情況,下面這篇文章主要給大家介紹了關(guān)于python項目運行導(dǎo)致內(nèi)存越來越大的原因詳析,本文通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • python實現(xiàn)輸入任意一個大寫字母生成金字塔的示例

    python實現(xiàn)輸入任意一個大寫字母生成金字塔的示例

    這篇文章主要介紹了python實現(xiàn)輸入任意一個大寫字母生成金字塔的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Python Opencv輪廓常用操作代碼實例解析

    Python Opencv輪廓常用操作代碼實例解析

    這篇文章主要介紹了Python Opencv輪廓常用操作代碼實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 適合Python初學(xué)者的一些編程技巧

    適合Python初學(xué)者的一些編程技巧

    這篇文章主要介紹了給Python初學(xué)者的一些編程技巧,皆是基于基礎(chǔ)的一些編程習(xí)慣建議,需要的朋友可以參考下
    2020-02-02
  • python實現(xiàn)固定尺寸圖像拼接

    python實現(xiàn)固定尺寸圖像拼接

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)固定尺寸圖像拼接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Python中IO多路復(fù)用模塊selector的用法詳解

    Python中IO多路復(fù)用模塊selector的用法詳解

    selector?是一個實現(xiàn)了IO復(fù)用模型的python包,實現(xiàn)了IO多路復(fù)用模型的?select、poll?和?epoll?等函數(shù),下面就跟隨小編一起來學(xué)習(xí)一下它的具體使用吧
    2024-02-02
  • 將python程序打包成DLL的三種方式

    將python程序打包成DLL的三種方式

    這篇文章主要介紹了將python程序打包成DLL的三種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python中yield返回生成器的詳細(xì)方法

    Python中yield返回生成器的詳細(xì)方法

    這篇文章主要介紹了Python中的yield返回生成器,生成器是Python編程進階中的重要知識點,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-11-11
  • Python腳本提取fasta文件單序列信息實現(xiàn)

    Python腳本提取fasta文件單序列信息實現(xiàn)

    這篇文章主要為大家介紹了Python腳本提取fasta文件單序列信息實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • python對指定字符串逆序的6種方法(小結(jié))

    python對指定字符串逆序的6種方法(小結(jié))

    這篇文章主要介紹了python對指定字符串逆序的6種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評論

石台县| 班戈县| 安塞县| 平谷区| 新乡市| 衡阳县| 图木舒克市| 旅游| 治县。| 慈溪市| 榕江县| 丽江市| 台中市| 自贡市| 桐柏县| 武隆县| 绩溪县| 偏关县| 岳池县| 岳阳县| 巴彦淖尔市| 福州市| 湟中县| 临沭县| 清水县| 鲁山县| 丰宁| 济源市| 家居| 玉溪市| 高碑店市| 文山县| 吉木乃县| 米脂县| 沂南县| 措勤县| 宁国市| 松溪县| 惠安县| 红安县| 长阳|