Skip to content

Commit fd2bd92

Browse files
committedOct 9, 2019
no message
1 parent 6024b83 commit fd2bd92

File tree

5 files changed

+73
-1
lines changed

5 files changed

+73
-1
lines changed
 

‎monkey_patch_pattern/README.md

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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+

‎monkey_patch_pattern/a.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# -*- coding: utf-8 -*-
2+
# @Author : ydf
3+
# @Time : 2019/10/9 0009 12:12
4+
5+
def fun():
6+
print('原始的 print hello')

‎monkey_patch_pattern/b.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
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()

‎monkey_patch_pattern/run.py

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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+
"""

‎行为型模式-发布订阅模式.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
88
但其实没有必要太深究 2 者区别,因为《Head First 设计模式》这本经典书都写了:发布+订阅=观察者模式。其核心思想是状态改变和发布通知。在此基础上,根据语言特性,进行实现即可。
99
10-
对比观察者模式看。23种经典设计模式里面不包括发布订阅设计模式,区别太小
10+
对比观察者模式看。23种经典设计模式里面不包括发布订阅设计模式,区别很小
1111
"""
1212

1313
class Event:

0 commit comments

Comments
 (0)
Please sign in to comment.