Python编程实战:运用设计模式、并发和程序库创建高质量程序 阅读笔记

Python编程实战:运用设计模式、并发和程序库创建高质量程序

创建型设计模式

  1. 抽象工厂
    1. @classmethod def make_xxx(Class, ...)
  2. Builder
    1. with open(filename, "w", encoding=‘utf-8‘) as f: f.write(x)
    2. 多一层映射封装好吗?
    3. 序列与map的unpacking:function(*args, **kwargs)
    4. super().add_title(t) #=> BaseClass.add_title(self, t) ?
  3. 工厂方法
  4. 原型
    1. for code in itertools.chain( (0x26C0,0x26C2), range(0x2654,0x2660) ): ...
    2. setattr(sys.module[__name__], name, Class) #=> globals()[name]=Class
  5. 单例
    1. key = "{}({})".format(name, currency)

结构型设计模式

  1. 适配器(Python的mock对象?):协调调用者与被调用者,使得接口一致
    1. 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
    2. @Qtrac.has_methods("header", "paragaph", "footer")
      class Renderer(metaclass=abc.ABCMeta): pass
  2. 桥接:bridge接口与实现(而不是直接继承)
  3. 组合
    1. composite即容器类型的元素
  4. 修饰器
    1. 实现了__eq__和__lt__后,即可通过@functools.total_ordering支持< <= == != >= >
    2. 实现decorator时,对wrapper加装饰@functools.wraps(func),可使得wrapper函数的__name__ __doc__与原func相同
    3. def wrapper(*args, **kwargs): ... return func(*args, **kwargs)
    4. 类修饰器:用getattr/setattr/property等对Class对象进行操作
  5. 外观:对不同的实现抽象一套相同的接口
    1. ?绑定方法:bound=self.f vs. unbound=Class.f
  6. 享元(Flyweight)
    1. Java:String#intern?
    2. p53 Python序列化过程中能够执行任意代码,不安全(How?)
  7. 代理:用一个对象代表另一个对象
    1. ‘远程代理’
    2. RPyC库

行为型设计模式

  1. 责任链
    1. p61 凡是带有yield语句的函数都能作为generator,利用@coroutine及无限循环可将其变为协程(感觉这里与Scheme的CPS有点关联)
    @coroutine
    def handler(successor):
    while True:
    event = (yield)
    successor.send(event)
  2. 命令
    1. Undo-Redo
  3. 解释器
    1. DSL:PLY PyParsing
    2. eval()
    3. ast.literal_eval()
    4. exec()
    5. 用子进程执行代码:with subprocess.Popen([sys.executable, "-"], ...) as process: ...
    6. stderr = re.sub(", line (\d+)", lambda m: str(int(m.group(1))-offset), stderr)
    7. PyPy “沙盒”
  4. 迭代器
    1. 序列协议:实现__getitem__
    2. 双参数iter(callable, sentinel):需实现__call__
    3. 迭代器协议:__iter__()和__next__()
  5. 中介:实现一组接口与多个对象之间的对接(m:n连接?)
    1. 相当于GUI编程中的各种EventListener?
    2. 使用协程实现中介者
  6. 备忘录
    1. pickle模块?(就是对象序列化/反序列化)
  7. 观察者
    1. 其实就是感兴趣者单独注册的回调,对象状态改变时,所有观察者都会得到通知
    2. MVC:视图是模型的观察者?
    3. 其他:数据库trigger、Django的signaling系统、Qt的signal-SLOT
  8. 状态
  9. 策略
    1. 算法(战术?)可切换
  10. 模板方法
  11. Visitor(经常用在编译器的AST遍历代码生成中)
    1. p114 PyPNG使用RGBA格式,而Image却是ARGB

高级并发

  1. 计算密集型:避开GIL
    1. multiprocessing.JoinableQueue.join/task_done()
    2. multiprocessing.Queue.get/get_nowait()
    3. 3.2 concurrent.futures模块
      1. concurrent.futures.ProcessPoolExecutor
  2. I/O密集型:主要因素是网络延迟,与线程还是进程没有多大关系
  3. 案例研究:并发型GUI应用
    1. multiprocessing.Value

扩充Python

  1. PyPy JIT
  2. ctypes:略
  3. Cython
    1. .pxd文件:
      cdef extern from "hyphen.h":
      ctypedef struct HyphenDict: pass
      HyphenDict* hnj_hyphen_load(char* filename)
    2. .pyx
  4. 与C++交互:SWIG、SIP、boost::python、CFFI

高级网络编程

  1. XML-RPC:略
  2. RPyC:略

Tkinter

  1. PyGtK/PyGObject
  2. PyQt4/PySide
  3. Tkinter
    1. 模态:全局/应用级/窗口级/无
  4. wxPython

OpenGL

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。