1、猴子补丁就是不改变原有模块的内容的前提下,给原有模块新增方法或者修改原有模块。

一个模块的函数,如果希望改变函数的功能,不改变函数名,通常是库模块,你不可能去修改三方库的源码的,实施起来不方便,而且假设你直接在原处改了东西,别人继续用那个库模块,你没和别人提前打好招呼,那可能产生悲剧。

2、面向对象中,替换一个方法,继承重写方法就可以,当然也可以直接给原类的方法重新赋值一个函数对象,这也算猴子补丁。

面向过程是模块加函数的写法,不能继承。

此时做法可以是猴子补丁,就是重新给模块的某个函数赋值为一个自定义的函数对象。

3、以json为例,json只能解析基本的字符串  数字啥的,对大多数三方类型都不支持。

例如最常见的是从数据库中读取的时间字段,得到结果时候是datetime对象,此时直接json.dumps会造成解析错误。

但我原来谢了很多代码,之前的数据库没有时间类型的字段,所以现在有了时间后,原来的代码大面积出错,报TypeError: datetime.datetime(2018, 7, 12, 19, 44, 19, 141200) is not JSON serializable这个错误。

为了不一一修改,那就用monkey技术,

以下文件是我的utils包的__init__.py文件

这样做了后,

1)原来的所有其他地方的json.dumps代码不用做任何修改,就可以直接解析时间了,

2)json.dumps方法解析有中文的字典时候很蛋疼,必须设置ensure_ascii=False才能显示汉字,每次都加这几个字也很麻烦。现在用了monkey patch,原来所有没设置这个参数的json.dumps方法现在也能直接解析出中文了。

3)由于我所有代码几乎都import了utils包,直接在包里面执行了monkey_patch_json()方法,所以不用再去单独模块调用pacth函数了。

import json
from .log_manager import LogManager, get_logs_dir_by_folder_name
from .redis_manager import RedisManagerfrom . import decorators, config_ydf
from .currency_converter import CurrencyConverter
from .local_ip_query import get_host_ip
from datetime import datetime as _datetime
from datetime import date as _date def show_sys_path():
import sys
print(sys.path) class _CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, _datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, _date):
return obj.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self, obj) def _dumps(obj, skipkeys=False, ensure_ascii=False, check_circular=True,
allow_nan=True, cls=_CustomEncoder, indent=None, separators=None,
default=None, sort_keys=False, **kw):
if (not skipkeys and ensure_ascii and
check_circular and allow_nan and
cls is None and indent is None and separators is None and
default is None and not sort_keys and not kw):
return json._default_encoder.encode(obj) # noqa
return cls(
skipkeys=skipkeys, ensure_ascii=ensure_ascii,
check_circular=check_circular, allow_nan=allow_nan, indent=indent,
separators=separators, default=default, sort_keys=sort_keys, ).encode(obj) def monkey_patch_json():
json.dumps = _dumps monkey_patch_json() # pacth掉json模块的dumps方法

monkey不光可以patch三方库,其他方面也包括,比如原来写了个A类,现在想要试用B类的效果,只要你保证A和B的公有方法和属性的名字都是一样的,然后直接写A = B就可以了,

假如A类在其他各个文件中被使用了几百次,那么你不需要去每个地方修改一下,因为调用A,但实际使用的是B。

python monkey 猴子补丁技术编程,修改python json dumps方法。的更多相关文章

  1. python的猴子补丁monkey patch

    monkey patch指的是在运行时动态替换,一般是在startup的时候. 用过gevent就会知道,会在最开头的地方gevent.monkey.patch_all();把标准库中的thread/ ...

  2. Python之猴子补丁

    1.在运行时,对属性,方法,函数等进行动态替换 2.其目的往往是为了通过替换,修改来增强,扩展原有代码的能力 #test2.py class Person: def get_score(self): ...

  3. python基础===猴子补丁

    >>> class test: def A(self, x, y): return x+y >>> t = test() >>> t.A(10,2 ...

  4. Python学习笔记之面向对象编程(三)Python类的魔术方法

    python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...

  5. 洗礼灵魂,修炼python(39)--面向对象编程(9)—魔法方法表

    好的,不多说,大招来了,几乎完整的魔法方法: 基本的魔法方法 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Defi ...

  6. python json.dumps(output) ^ SyntaxError: invalid syntax

    问题 下面代码在有些机器上执行正常,有些机器上执行报错: import json output={} print json.dumps(output) python代码报错: line 277 pri ...

  7. Python json.dumps 特殊数据类型的自定义序列化操作

    场景描述: Python标准库中的json模块,集成了将数据序列化处理的功能:在使用json.dumps()方法序列化数据时候,如果目标数据中存在datetime数据类型,执行操作时, 会抛出异常:T ...

  8. Python下调用json.dumps中文显示问题解决办法

    json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,例如: import json js = json.loads('{"haha": & ...

  9. python中eval()和json.dumps的使用

    在python中通过requests.get(url)获取json数据,此时可能需要eval进行解析. # -*- coding: utf-8 -*- import requests r = requ ...

随机推荐

  1. linux 重定向 标准错误与标准输出到同一文件

    Linux Shell 环境中的输入输出重定向,用符号<和>来表示.0.1和2分别表示标准输入.标准输出和标准错误. 1.重定向标准输出到文件: cat foo > foo.txt ...

  2. 【进阶修炼】——改善C#程序质量(2)

    16, 元素可变的情况下应避免用数组. 数组是定长的集合,可以考虑用ArrayList或List<T>集合.ArrayList元素是object类型,有装箱的开销,性能较低.另外Array ...

  3. [转] JSON转换

    转载自:http://www.360doc.com/content/12/0413/14/9529755_203286509.shtml# JSON简介 JSON(JavaScript Object ...

  4. elasticsearch6.4 memory locking requested for elasticsearch process but memory is not locked 终极解决

    echo "es hard memlock unlimited">>/etc/security/limits.confecho "es soft memloc ...

  5. Android开发 listitem中采用倒计时

    采用单个倒计时控件会紊乱,故采用在activity中倒计时异步刷新通知的方式全局更新数据源  notifyDataSetChanged 效果如下: 大致思路: 若出现刷新倒计时有的显示有的不显示的情况 ...

  6. Java设计模式(17)解释器模式(Interpreter模式)

    Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...

  7. javascript显示年月日时间代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 浅谈跨域以WebService对跨域的支持

    跨域问题来源于JavaScript的同源策略,即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问.也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源. 在 ...

  9. 使用x11vnc作为vncserver端

    1 安装x11vnc $ sudo apt-get update $ sudo apt-get install x11vnc 2 生成密码 $ x11vnc -storepasswd Enter VN ...

  10. [Python学习]Iterator 和 Generator的学习心得

    [Python学习]Iterator 和 Generator的学习心得 Iterator是迭代器的意思,它的作用是一次产生一个数据项,直到没有为止.这样在 for 循环中就可以对它进行循环处理了.那么 ...