1、所有书中都没有把猴子补丁作为一种设计模式来看待。因为设计模式的模式的命名是根据java中提炼出来的,语言方式决定了java绝对不会有也不需要有这种操作,不存在的。那自然设计模式不会包括猴子补丁模式。

2、根据百度百科介绍,设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。只要是解决高可扩展和高可复用的编码问题就可以算是一种设计模式,猴子补丁是在python里面一种很普遍达到这种目的方式,所以可以算是一种设计模式。

3、在python 函数和类和全局变量都是一等公民,不是所有东西必须都要写到一个类里面包裹起来,写起来很自由。有的python人员c语言中毒太深或者连c语言都没学过只自学python,写代码项目里面永远只会有0个类(除开文档上规定死了要写一个类的这种类),模块加函数的写法只能解决局部复用,和类的可复用性相比差距很大。但是别人就是打死也不愿意项目里面有一个类出现,这种情况怎么改造这个模块的整体功能?

假设有个文件叫  xxx.py, 且xxx.py代码如下:

_var_aaa = 1

def _function_bbb(paramx):

  return paramx * 10

def function_ccc(paramx):

  print(_var_aaa)                            # 这里假设是print,实际肯定是拿着var_aaa变量做实际有意义的事情

   _function_bbb(paramx)

do_othrething()  ................................

模块的function_ccc函数是唯一 作为公有函数,是希望被外界调用的。但这个函数很蛋疼,依赖了模块/包  里面的外部变量和外部函数,要改他并不是改这个函数本身就能达到目的,还要改其他地方。

假如希望全局变量 _var_aaa的初始值是2,函数_function_bbb的功能是吧变量扩大100倍,怎么改?

1)、去修改源文件,肯定不靠谱,你硬编码的方式改了这里的代码,如果没通知别人,别人继续使用,别人调用函数会出来新的结果会出毛病。而且猴子补丁很多时候是针对三方包或者官方包,去直接修改那些地方的文件很不靠谱,任何时候都不要这么做。

2)、把整个包/模块复制出来一份,然后修改其中的一小部分几行代码,杀鸡用牛刀,为了0.01%代码的改变,无缘无故增加几千几万行相同字母的代码。

以上两种方法都不好,在最小代价下实现 全局变量 _var_aaa的初始值是2,函数__function_bbb的功能是吧变量扩大100倍,应该就是轮到猴子补丁上场了,

import xxx

xxx._var_aaa = 2

def _my_function_bbb(paramx):

  return paramx * 100

xxx._function_bbb = _my_function_bbb

之后再次调用 function_ccc,就会使改变生效了,不止当前代码模块处会生效,运行patch后会使所有地方生效。

猴子补丁赖以实现的基础是

python 模块会导入几次?猴子补丁为什么可以实现?

4、  最好还是使用面向对象来编程。猴子补丁模式虽灵活,猴子补丁是在之前扩展没设计好的基础上才不得已为之才使用的。用起来很多弊端,比如pycharm智能提示和跳转支持很差,因为是在运行时后改变行为的,pycahrm是死的只会根据固定的代码结构进行智能提示和补全,不会去猜测运行时候的行为。模块始终是个单例,一会儿想var_aaa初始变量是3一会希望他是2,一会希望function_bbb的功能是扩大一百倍一会儿希望他是扩大一万倍,猴子补丁是无法实现得,使用面oop这些问题是非常轻松非常正常自然的完成的,完全不需要想。因为类可以继承,模块无法继承;类是多实例的(每个实例就像无数复制出来的内部属性互不干扰的模块),不会像模块一样只有一份。

5、自己写的代码最好设计好扩展使用oop,不要让自己的模块有被别人打猴子补丁的想法和机会。让打猴子补丁只发生在修改三方包和官方包的时候,如果自己写的代码也需要大猴子补丁才能实现改造,那应该是没设计好,没有暴露出使用策略/模板方法。

6、关于面向过程和面向对象编程,介绍了很多次区别,和oop的优点。我绝对没说过所有场景所有地方都要全100%使用纯oop,但我反对那些不管任何情况都坚持代码只有0个类的写法,这种写法情况的人现实和网上见过很多。多试下多对比下才能知道体会到区别,不然老是笼统的二逼的说法就是大项目用oop小项目用ofp当挡箭牌。具体多大才算大?200行代码不算大吗,每次新做项目功能时候把自己的200行代码复制黏贴扣字修改反复弄几百次也算200行吗?大项目也不可能纯100%oop,会两样都有。

要知道什么时候使用oop,而不是数代码的行数再来决定使不使用oop,比如8种方法实现写计数器例子,实现计数器总共才不到10行,写闭包函数明显比使用类更晦涩难懂,难道行数少就适合函数吗?大项目也不是所有函数都需要改成方法包裹在类里面。

到底是用哪一种,一个判断是函数如果是非常孤立的,不依赖外部状态和依赖的外部函数不可能需要改变,比如单独做个时间格式转换,用函数没毛病,放在大项目也可以。

如果函数有一些依赖,特别是依赖的属性和函数需要弹性改变,使用类好。

据我的实践,我使用oop改造了项目里面的很多模块或者子任务,基本上每次使用oop重构都能够比原有的opp代码减少40%-90%的代码行数。

python设计模式之猴子补丁模式的更多相关文章

  1. python中的猴子补丁Monkey Patch

    python中的猴子补丁Monkey Patch 什么是猴子补丁 the term monkey patch only refers to dynamic modifications of a cla ...

  2. python设计模式之常用创建模式总结(二)

    前言 设计模式的创建模式终极目标是如何使用最少量最少需要修改的代码,传递最少的参数,消耗系统最少的资源创建可用的类的实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常 ...

  3. 简介Python设计模式中的代理模式与模板方法模式编程

    简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...

  4. 实例解析Python设计模式编程之桥接模式的运用

    实例解析Python设计模式编程之桥接模式的运用 这篇文章主要介绍了Python设计模式编程之桥接模式的运用,桥接模式主张把抽象部分与它的实现部分分离,需要的朋友可以参考下 我们先来看一个例子: #e ...

  5. python设计模式之责任链模式

    python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...

  6. python设计模式之享元模式

    python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...

  7. python设计模式之修饰器模式

    python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...

  8. Python设计模式: 最佳的"策略"模式实践代码

    Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...

  9. Python Monkey patch猴子补丁

    monkey patch (猴子补丁)   用来在运行时动态修改已有的代码,而不需要修改原始代码. 简单的monkey patch 实现:[python] #coding=utf-8 def orig ...

随机推荐

  1. Yii2 表单(form)

    表单 1.表单的创建 在 yii 中主要通过 yii\widgets\ActiveForm 类来创建表单 ActiveForm::begin() 不仅创建了一个表单实例,同时也标志着表单的开始. 放在 ...

  2. day4函数文件操作

    一.高效读取文件 1.使用with打开文件,程序运行完后会自动关闭打开的文件 2.修改文件,将文件中的123替换为a(简单粗暴方式) 3.打开两个文件,修改后将旧文件删除,将新文件名字改成旧文件的名称 ...

  3. db2 reorgchk

    db2 reorgchk 命令是最重要的.也是经常被忽略的 DB2 调整命令之一. db2 reorgchk 命令被忽略是因为它不是一个一次性调整项.由于更新是在 DB2 数据库上执行的,因此关于表的 ...

  4. 小甲鱼Python视频课后答案(第一讲)---仅记录学习

    1.python是什么语言? Python是一种支持面向对象的解释性高级语言,属于脚本语言的一种. 2.IDLE是什么? IDLE是开发python程序的基本IDE(集成开发环境),具备基本的IDE的 ...

  5. python 可迭代对象

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. 可以用for 进行迭代的,一般都是可迭代对象: ...

  6. poj3061 Subsequence(尺取法)

    https://vjudge.net/problem/POJ-3061 尺取发,s和t不断推进的算法.因为每一轮s都推进1所以复杂度为O(n) #include<iostream> #in ...

  7. 第三届山西省赛1004 一道大水题(scanf)

    一道大水题 时间限制: C/C++ 2000ms; Java 4000ms 内存限制: 65535KB 通过次数: 44 总提交次数: 1020 问题描述 Dr. Pan作为上兰帝国ACM的总负责人, ...

  8. 记录使用yum安装nginx之后的目录问题

    一般来说我们安装nginx的目录都是/usr/local/nginx的,但是用yum安装的目录跟手动安装的不一样,下面是整理的使用yum安装的一些对应目录. nginx执行文件目录:/usr/sbin ...

  9. NoSQL简单介绍

    这里介绍一下如今经常使用的NoSQL以及各自的特点. NoSQL是2009年突然发展起来的.如今趋于稳定的状态,市场上也有了一些比較成熟的产品. 传统的关系型数据库为了保证通用性的设计而带来了功能复杂 ...

  10. HTTPS IP直连问题小结

    HTTPS IP直连问题小结: https://blog.csdn.net/leelit/article/details/77829196 可以使用OkHttpClient进行相同IP地址,不同DNS ...