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

python 猴子補(bǔ)丁(monkey patch)

 更新時(shí)間:2019年06月26日 08:51:12   作者:d咚咚嗆  
這篇文章主要介紹了python 猴子補(bǔ)丁(monkey patch),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

寫了一段時(shí)間java切回寫python偶爾會(huì)出現(xiàn)一些小麻煩,比如:在java中自定義對(duì)象變成json串很簡(jiǎn)單,調(diào)用一個(gè)方法就行,但同樣的轉(zhuǎn)換在python中卻不太容易實(shí)現(xiàn)。在尋找python自定義對(duì)象轉(zhuǎn)json串的過(guò)程中,接觸到了猴子補(bǔ)丁這個(gè)東西,感覺(jué)還有點(diǎn)意思;本文先實(shí)現(xiàn)python自定義對(duì)象轉(zhuǎn)json串,再簡(jiǎn)單談一下猴子補(bǔ)丁。

python自定義對(duì)象轉(zhuǎn)json串

python自帶的json包不支持自定義對(duì)象轉(zhuǎn)json串,在python中用json.dumps轉(zhuǎn)自定義對(duì)象時(shí)會(huì)報(bào)異常class is not JSON serializable,通過(guò)增加一段代碼補(bǔ)?。ǚQ作猴子補(bǔ)?。┍憧蓪?shí)現(xiàn)自定義轉(zhuǎn)換,補(bǔ)丁代碼如下:

from json import JSONEncoder
  def _default(self, obj):
    return getattr(obj.__class__, "to_json", _default.default)(obj)
  _default.default = JSONEncoder().default
  default.JSONEncoder.default = _default

同時(shí)在自定義對(duì)象里面實(shí)現(xiàn)to_json方法。

class Tmp:
  def __init__(self, id, name):
    self.id = id
    self.name = name

  def to_json():
    # 返回自定義對(duì)象json串
    pass

最后保證補(bǔ)丁代碼在自定義對(duì)象轉(zhuǎn)json之前執(zhí)行過(guò)一次即可。

通過(guò)補(bǔ)丁代碼我們可以看到,代碼替換了json包的默認(rèn)轉(zhuǎn)json的方法,運(yùn)行了補(bǔ)丁代碼后,轉(zhuǎn)json的過(guò)程變成了先找對(duì)象的to_json屬性,在沒(méi)有to_json屬性的情況下才使用默認(rèn)的JSONEncoder.default的方法,也就是通過(guò)這么一個(gè)patch,增加了json包原來(lái)沒(méi)有的功能。

猴子補(bǔ)丁

關(guān)于猴子補(bǔ)丁為啥叫猴子補(bǔ)丁,據(jù)說(shuō)是這樣子的:

這個(gè)叫法起源于Zope框架,大家在修正Zope的Bug的時(shí)候經(jīng)常在程序后面追加更新部分,這些被稱作是“雜牌軍補(bǔ)丁(guerilla patch)”,后來(lái)guerilla就漸漸的寫成了gorllia((猩猩),再后來(lái)就寫了monkey(猴子),所以猴子補(bǔ)丁的叫法是這么莫名其妙的得來(lái)的。

猴子補(bǔ)丁主要有以下幾個(gè)用處:

  • 在運(yùn)行時(shí)替換方法、屬性等
  • 在不修改第三方代碼的情況下增加原來(lái)不支持的功能
  • 在運(yùn)行時(shí)為內(nèi)存中的對(duì)象增加patch而不是在磁盤的源代碼中增加

例如:上面自定義對(duì)象轉(zhuǎn)json,在原有json包不滿足的條件下,只需要將以上的一個(gè)patch寫在一個(gè)文件里自己再import一次,便可實(shí)現(xiàn)自己想要的功能,這是非常方便的。

可以知道猴子補(bǔ)丁的主要功能便是在不去改變?cè)创a的情況下而對(duì)功能進(jìn)行追加和變更;對(duì)于編程過(guò)程中使用一些第三方不滿足需求的情況下,使用猴子補(bǔ)丁是非常方便的。

猴子補(bǔ)丁,算是編程中的一個(gè)技巧了。

拓展

json包默認(rèn)轉(zhuǎn)json的過(guò)程

可以看一下json包里面轉(zhuǎn)json串的過(guò)程:

 def _iterencode(o, _current_indent_level):
    if isinstance(o, basestring):
      yield _encoder(o)
    elif o is None:
      yield 'null'
    elif o is True:
      yield 'true'
    elif o is False:
      yield 'false'
    elif isinstance(o, (int, long)):
      yield str(o)
    elif isinstance(o, float):
      yield _floatstr(o)
    elif isinstance(o, (list, tuple)):
      for chunk in _iterencode_list(o, _current_indent_level):
        yield chunk
    elif isinstance(o, dict):
      for chunk in _iterencode_dict(o, _current_indent_level):
        yield chunk
    else:
      if markers is not None:
        markerid = id(o)
        if markerid in markers:
          raise ValueError("Circular reference detected")
        markers[markerid] = o
      o = _default(o)
      for chunk in _iterencode(o, _current_indent_level):
        yield chunk
      if markers is not None:
        del markers[markerid]

其實(shí)就是一連串的if-elif-else,將所有的自建對(duì)象都匹配一遍,最后匹配不到的就報(bào)錯(cuò)了,所以自定義對(duì)象轉(zhuǎn)json自然會(huì)有問(wèn)題。

其他實(shí)現(xiàn)自定義對(duì)象轉(zhuǎn)json的方法

其實(shí)json包的源碼文檔里面也有很詳細(xì)的別的自定義對(duì)象轉(zhuǎn)json的方法。

r'''
Specializing JSON object decoding::

  >>> import json
  >>> def as_complex(dct):
  ...   if '__complex__' in dct:
  ...     return complex(dct['real'], dct['imag'])
  ...   return dct
  ...
  >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',
  ...   object_hook=as_complex)
  (1+2j)
  >>> from decimal import Decimal
  >>> json.loads('1.1', parse_float=Decimal) == Decimal('1.1')
  True

Specializing JSON object encoding::

  >>> import json
  >>> def encode_complex(obj):
  ...   if isinstance(obj, complex):
  ...     return [obj.real, obj.imag]
  ...   raise TypeError(repr(o) + " is not JSON serializable")
  ...
  >>> json.dumps(2 + 1j, default=encode_complex)
  '[2.0, 1.0]'
  >>> json.JSONEncoder(default=encode_complex).encode(2 + 1j)
  '[2.0, 1.0]'
  >>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j))
  '[2.0, 1.0]'
'''

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • tensorflow實(shí)現(xiàn)打印ckpt模型保存下的變量名稱及變量值

    tensorflow實(shí)現(xiàn)打印ckpt模型保存下的變量名稱及變量值

    今天小編就為大家分享一篇tensorflow實(shí)現(xiàn)打印ckpt模型保存下的變量名稱及變量值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Python中規(guī)范定義命名空間的一些建議

    Python中規(guī)范定義命名空間的一些建議

    命名空間是Python程序的一大根本,編程時(shí)持命名空間的整潔還是十分必要的,這里就來(lái)為大家總結(jié)Python中規(guī)范定義命名空間的一些建議,需要的朋友可以參考下
    2016-06-06
  • Django與AJAX實(shí)現(xiàn)網(wǎng)頁(yè)動(dòng)態(tài)數(shù)據(jù)顯示的示例代碼

    Django與AJAX實(shí)現(xiàn)網(wǎng)頁(yè)動(dòng)態(tài)數(shù)據(jù)顯示的示例代碼

    這篇文章主要介紹了Django與AJAX實(shí)現(xiàn)網(wǎng)頁(yè)動(dòng)態(tài)數(shù)據(jù)顯示的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 使用Python實(shí)現(xiàn)圖片轉(zhuǎn)ICO格式

    使用Python實(shí)現(xiàn)圖片轉(zhuǎn)ICO格式

    這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫一個(gè)基于PyQt5的用于將圖像文件轉(zhuǎn)換為ICO格式GUI應(yīng)用程序,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • Python跳出多重循環(huán)的方法示例

    Python跳出多重循環(huán)的方法示例

    這篇文章主要介紹了Python跳出多重循環(huán)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 十個(gè)常見(jiàn)的Python腳本詳細(xì)介紹及代碼舉例

    十個(gè)常見(jiàn)的Python腳本詳細(xì)介紹及代碼舉例

    這篇文章主要給大家介紹了十個(gè)常見(jiàn)的Python腳本的相關(guān)資料,包括批量重命名文件、下載網(wǎng)頁(yè)圖片、發(fā)送郵件通知、讀取和寫入CSV文件、爬取網(wǎng)頁(yè)數(shù)據(jù)、自動(dòng)化測(cè)試、圖像處理、數(shù)據(jù)可視化以及創(chuàng)建簡(jiǎn)單的Web應(yīng)用,需要的朋友可以參考下
    2024-11-11
  • 打開(kāi)電腦上的QQ的python代碼

    打開(kāi)電腦上的QQ的python代碼

    使用python打開(kāi)電腦上的QQ,方法很簡(jiǎn)單,調(diào)用os模塊,然后os.startfile即可
    2013-02-02
  • Python的re模塊正則表達(dá)式操作

    Python的re模塊正則表達(dá)式操作

    這篇文章主要介紹了Python的re模塊正則表達(dá)式操作 的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • 基于Python編寫一個(gè)有趣的年會(huì)抽獎(jiǎng)系統(tǒng)

    基于Python編寫一個(gè)有趣的年會(huì)抽獎(jiǎng)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫一個(gè)簡(jiǎn)易的抽獎(jiǎng)系統(tǒng),順便幫助大家鞏固一下對(duì)Python語(yǔ)法和框架的理解,感興趣的小伙伴可以了解下
    2023-12-12
  • python 編寫簡(jiǎn)單網(wǎng)頁(yè)服務(wù)器的實(shí)例

    python 編寫簡(jiǎn)單網(wǎng)頁(yè)服務(wù)器的實(shí)例

    今天小編就為大家分享一篇python 編寫簡(jiǎn)單網(wǎng)頁(yè)服務(wù)器的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06

最新評(píng)論

杂多县| 开封市| 武强县| 宿松县| 中超| 栖霞市| 贵南县| 绥芬河市| 吴忠市| 牙克石市| 银川市| 通道| 天镇县| 文水县| 北安市| 河间市| 方城县| 那坡县| 甘南县| 平泉县| 思茅市| 江达县| 平远县| 边坝县| 汤阴县| 开封市| 大同市| 锦屏县| 枣庄市| 石景山区| 乃东县| 平原县| 台北县| 昌都县| 铜陵市| 于田县| 松溪县| 玉门市| 伊春市| 个旧市| 安平县|