Python编程实战:运用设计模式、并发和程序库创建高质量程序 阅读笔记
Python编程实战:运用设计模式、并发和程序库创建高质量程序
创建型设计模式
- 抽象工厂
- @classmethod def make_xxx(Class, ...)
- Builder
- with open(filename, "w", encoding=‘utf-8‘) as f: f.write(x)
- 多一层映射封装好吗?
- 序列与map的unpacking:function(*args, **kwargs)
- super().add_title(t) #=> BaseClass.add_title(self, t) ?
- 工厂方法
- 原型
- for code in itertools.chain( (0x26C0,0x26C2), range(0x2654,0x2660) ): ...
- setattr(sys.module[__name__], name, Class) #=> globals()[name]=Class
- 单例
- key = "{}({})".format(name, currency)
结构型设计模式
- 适配器(Python的mock对象?):协调调用者与被调用者,使得接口一致
- class Renderer(metaclass=abc.ABCMeta):
- @classmethod
- def __subclasshook__(Class, Subclass): #内置方法isinstance()通过此方法判断arg1是否是arg2的子类 3.3+
- if Class is Renderer:
- attributes = collections.ChainMap( *(Superclass.__dict__ for Superclass in Subclass.__mro__))
- methods = ("header", "paragaph", "footer")
- if all(method in attributes for method in methods): return True(特殊情形:and callable(method))
- return NotImplemented
- if Class is Renderer:
- 或
- @Qtrac.has_methods("header", "paragaph", "footer")
- class Renderer(metaclass=abc.ABCMeta): pass
- class Renderer(metaclass=abc.ABCMeta):
- 桥接:bridge接口与实现(而不是直接继承)
- 组合
- composite即容器类型的元素
- 修饰器
- 实现了__eq__和__lt__后,即可通过@functools.total_ordering支持< <= == != >= >
- 实现decorator时,对wrapper加装饰@functools.wraps(func),可使得wrapper函数的__name__ __doc__与原func相同
- def wrapper(*args, **kwargs): ... return func(*args, **kwargs)
- 类修饰器:用getattr/setattr/property等对Class对象进行操作
- 外观:对不同的实现抽象一套相同的接口
- ?绑定方法:bound=self.f vs. unbound=Class.f
- 享元(Flyweight)
- Java:String#intern?
- p53 Python序列化过程中能够执行任意代码,不安全(How?)
- 代理:用一个对象代表另一个对象
- ‘远程代理’
- RPyC库
行为型设计模式
- 责任链
- p61 凡是带有yield语句的函数都能作为generator,利用@coroutine及无限循环可将其变为协程(感觉这里与Scheme的CPS有点关联)
- @coroutine
- def handler(successor):
while True:
event = (yield)
successor.send(event)
- 命令
- Undo-Redo
- 解释器
- DSL:PLY PyParsing
- eval()
- ast.literal_eval()
- exec()
- 用子进程执行代码:with subprocess.Popen([sys.executable, "-"], ...) as process: ...
- stderr = re.sub(", line (\d+)", lambda m: str(int(m.group(1))-offset), stderr)
- PyPy “沙盒”
- 迭代器
- 序列协议:实现__getitem__
- 双参数iter(callable, sentinel):需实现__call__
- 迭代器协议:__iter__()和__next__()
- 中介:实现一组接口与多个对象之间的对接(m:n连接?)
- 相当于GUI编程中的各种EventListener?
使用协程实现中介者?
- 备忘录
- pickle模块?(就是对象序列化/反序列化)
- 观察者
- 其实就是感兴趣者单独注册的回调,对象状态改变时,所有观察者都会得到通知
- MVC:视图是模型的观察者?
- 其他:数据库trigger、Django的signaling系统、Qt的signal-SLOT
- 状态
- 策略
- 算法(战术?)可切换
- 模板方法
- Visitor(经常用在编译器的AST遍历代码生成中)
- p114 PyPNG使用RGBA格式,而Image却是ARGB
高级并发
- 计算密集型:避开GIL
- multiprocessing.JoinableQueue.join/task_done()
- multiprocessing.Queue.get/get_nowait()
- 3.2 concurrent.futures模块
- concurrent.futures.ProcessPoolExecutor
- I/O密集型:主要因素是网络延迟,与线程还是进程没有多大关系
- 案例研究:并发型GUI应用
- multiprocessing.Value
扩充Python
- PyPy JIT
- ctypes:略
- Cython
- .pxd文件:
- cdef extern from "hyphen.h":
ctypedef struct HyphenDict: pass
HyphenDict* hnj_hyphen_load(char* filename)
- cdef extern from "hyphen.h":
- .pyx
- .pxd文件:
- 与C++交互:SWIG、SIP、boost::python、CFFI
高级网络编程
- XML-RPC:略
- RPyC:略
Tkinter
- PyGtK/PyGObject
- PyQt4/PySide
- Tkinter
- 模态:全局/应用级/窗口级/无
- wxPython
OpenGL
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。