File tree 5 files changed +73
-1
lines changed
5 files changed +73
-1
lines changed Original file line number Diff line number Diff line change
1
+ ## 猴子补丁模式,演示多个文件,建了个文件夹。演示猴子补丁,正确的使用猴子补丁模式。
2
+ ```
3
+ 80%的py人员把猴子补丁和gevent库居然划等号。这样想大错特错。
4
+ gevent库是使用猴子补丁设计模式之一的库,比较复杂。
5
+ 任何人都有权利去使用甚至创造猴子补丁,这不是gevent库的专利,
6
+ 使用猴子补丁和安不安装gevent 、导不导入gevent没有半毛钱关系。
7
+
8
+ 猴子补丁要
9
+ 深刻理解模块天然是单例的原理
10
+ 深刻理解 from a import fun ;fun() 和 import a ; a.fun()的区别。否则猴子补丁失效或部分地方失效。
11
+ 要深刻理解 猴子补丁为什么最好要在运行的模块最顶行打的本质原因,不这样做可能会发生什么后果。这里面没有什么玄学,就是python语法。
12
+
13
+ 利用a.py b.py run.py,然后你需要把import 改成from import 测试对比,以及把run里面的import b放在打猴子补丁之前和打猴子补丁对比运行结果。
14
+ ```
15
+
16
+
Original file line number Diff line number Diff line change
1
+ # -*- coding: utf-8 -*-
2
+ # @Author : ydf
3
+ # @Time : 2019/10/9 0009 12:12
4
+
5
+ def fun ():
6
+ print ('原始的 print hello' )
Original file line number Diff line number Diff line change
1
+ # -*- coding: utf-8 -*-
2
+ # @Author : ydf
3
+ # @Time : 2019/10/9 0009 12:12
4
+ from monkey_patch_pattern .a import fun
5
+
6
+ def funbbb ():
7
+ print ('funbbbb中调用fun' )
8
+ fun ()
Original file line number Diff line number Diff line change
1
+ # -*- coding: utf-8 -*-
2
+ # @Author : ydf
3
+ # @Time : 2019/10/9 0009 12:12
4
+ """重要程度 ☆☆☆☆
5
+ 利用模块只会导入一次,模块天然单例的特性,使用猴子补丁。一处修改 处处生效。
6
+ 猴子补丁是python动态语言的重要设计模式,能用很少代码,大幅度改变很多地方的运行行为。
7
+ 对多人合作的大项目,如果猴子补丁直接在__init__.py里面执行了,并且猴子补丁变化有很大影响,则需要告诉小伙伴,免得出现莫名其妙的疑惑。
8
+ """
9
+ from monkey_patch_pattern import a
10
+
11
+
12
+ from monkey_patch_pattern .b import funbbb # TODO 请注释掉该行,测试在一开头导入funbbb和在打了猴子补丁之后再导入funbbb
13
+
14
+ def modify_fun ():
15
+ print ('修改后的 print world' )
16
+
17
+
18
+ a .fun = modify_fun
19
+
20
+ a .fun ()
21
+
22
+ print ('- - - - - ' )
23
+ # from monkey_patch_pattern.b import funbbb # TODO 请注释掉该行,请测试在一开头导入funbbb和在打了猴子补丁之后再导入funbbb
24
+
25
+ funbbb ()
26
+
27
+ """
28
+ 如果在第19行,即打了猴子补丁后再导入funbbb,结果是:
29
+ 修改后的 print world
30
+ - - - - -
31
+ funbbbb中调用fun
32
+ 修改后的 print world
33
+
34
+
35
+
36
+ 如果在开头行,即在打猴子补丁之前导入funbbb,结果是:
37
+ 修改后的 print world
38
+ - - - - -
39
+ funbbbb中调用fun
40
+ 原始的 print hello
41
+
42
+ """
Original file line number Diff line number Diff line change 7
7
8
8
但其实没有必要太深究 2 者区别,因为《Head First 设计模式》这本经典书都写了:发布+订阅=观察者模式。其核心思想是状态改变和发布通知。在此基础上,根据语言特性,进行实现即可。
9
9
10
- 对比观察者模式看。23种经典设计模式里面不包括发布订阅设计模式,区别太小 。
10
+ 对比观察者模式看。23种经典设计模式里面不包括发布订阅设计模式,区别很小 。
11
11
"""
12
12
13
13
class Event :
You can’t perform that action at this time.
0 commit comments