python设计模式--读书笔记
GoF在其设计模式一书中提出了23种设计模式,并将其分为三类:
- 创建型模式
将对象创建的细节隔离开来,代码与所创建的对象的类型无关。
- 结构型模式
简化结构,识别类与对象间的关系,重点关注类的继承和组合。
- 行为型模式
关注对象间的交互以及对象间的响应性。
单例设计模式
- 确保类只有一个对象被创建
- 为对象提供一个全局都可以访问的入口
- 控制共享资源的并发访问
1 简单实现:
通过覆盖__new__方法来控制对象的创建。
class Singleton(object):
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance s1 = Singelton()
s2 = Singleton()
更进一步,可以改写成:
class HealthCheck:
_instance = None
def __new__(cls, *args, **kwargs):
if not HealthCheck._instance:
HealthCheck._instance = super(HealthCheck, cls).__new__(cls, *args, **kwargs)
return HealthCheck._instance def __init__(self):
self.servers = []
def do1(self):
pass
def do2(self):
pass
2 python元类
实例化对象时,该类所继承的元类的__call__方法控制着该过程。
class MetaSingleton(type):
_instance = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instance:
cls._instance[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
return cls._instance class Logger(metaclass = MetaSingleton):
pass logger1 = Logger()
logger2 = Logger()
工厂模式
简单工厂模式
工厂方法模式
抽象工厂模式
代理模式
- 为其他对象提供了一个代理,从而实现了对原始对象的访问控制。
- 相当于增加了一个层或接口。增加了安全性。
- 代理模式与装饰器不同,后者是在原有对象上动态的添加新的行为;而前者是在程序编译时完成的,旨在控制外界对被代理对象的访问。
class Actor(object):
def __init__(self):
self.isBusy = False def occupied(self):
self.isBusy = True
print(type(self).__name__, "is occupied with current movie") def available(self):
self.isBusy = False
print(type(self).__name__, "is free for the movie") def getStatus(self):
return self.isBusy class Agent(object):
def __init__(self):
self.principal = None def __work(self):
self.actor = Actor()
if self.actor.getStatus():
self.actor.occupied()
else:
self.available() if __name__ == '__main__':
r = Agent()
r.work()
代理的分类:
- 虚拟代理
- 远程代理
- 保护代理
- 智能代理
python设计模式--读书笔记的更多相关文章
- HeadFirst设计模式读书笔记--目录
HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...
- Head First 设计模式读书笔记(1)-策略模式
一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...
- JavaScript设计模式:读书笔记(未完)
该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...
- Head First 设计模式读书笔记
在网上学习了一段时间设计模式,总感觉不系统,很容易忘,最近买书,学习了<Head First设计模式>,受益匪浅,特做此记录,以便激励自己不断的向后学习. 原书JAVA版本,本次学习记录及 ...
- <代码整洁之道>、<java与模式>、<head first设计模式>读书笔记集合
一.前言 几个月前的看书笔记 ...
- head first 设计模式读书笔记 之 策略模式
作为一个php开发者,深知曾经很多程序员都鄙视php,为什么呢?因为他们认为php的语法是dirty的,并且由于开发者水平参差不齐导致php的代码更加乱上加乱,维护起来简直一坨shit一样.随着php ...
- 《流畅的python》读书笔记
流畅的python 第1章 python数据模型 ---1.1 一摞Python风格的纸牌 特殊方法,即__method__,又被称为魔术方法(magic method)或者双下方法(dunder-m ...
- JavaScript设计模式 -- 读书笔记
JavaScript设计模式 一. 设计模式 一个模式就是一个可重用的方案: 有效的解决方法.易重用.善于表达该解决方案: 未通过"模式特性"测试的模式称为模式原型: 三规则:适用 ...
- Python cookbook - 读书笔记
Before: python built-in function: docs 我只想学function map(), THIS - 摘: map(foo, seq) is equivalent to ...
随机推荐
- Requests接口测试-对cookies的操作处理(二)
我们继续来讨论一下cookie这方面的内容,我们都知道cookie是数据,一般的话在我接口测试中,数据都是要和代码进行分离的.本篇内容,我们队cookie内容进行处理,我们把登陆成功后的cookie写 ...
- 马尔可夫决策过程MDP
1. 马尔可夫模型的几类子模型 马尔科夫链(Markov Chain),了解机器学习的也都知道隐马尔可夫模型(Hidden Markov Model,HMM).它们具有的一个共同性质就是马尔可夫性(无 ...
- a 标签 name 属性 页面定位 (一)
a(§b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
- 编写高质量代码改善C#程序的157个建议——建议106:为静态类添加静态构造函数
建议106:为静态类添加静态构造函数 静态类可以拥有构造方法,这就是静态构造方法.静态构造方法与实例构造方法比较有几个自己的特点: 只被执行一次,且在第一次调用类成员之前被运行时执行. 代码无法调用它 ...
- apache mina2.0源码解析(一)
apache mina是一个基于java nio的网络通信框架,为TCP UDP ARP等协议提供了一致的编程模型:其源码结构展示了优秀的设计案例,可以为我们的编程事业提供参考. 依照惯例,首先搭建a ...
- Sublime Text3下载激活汉化
一.下载 Sublime Text3下载 http://www.sublimetext.com/3 选择对应的版本下载即可. 二.激活 2.1 官网购买license key激活 2.2 网上查找各种 ...
- [LeetCode 题解]: ZigZag Conversion
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 The string ...
- 用Java实现多线程服务器程序
一.Java中的服务器程序与多线程 在Java之前,没有一种主流编程语言能够提供对高级网络编程的固有支持.在其他语言环境中,实现网络程序往往需要深入依赖于操作平台的网络API的技术中去,而Java提供 ...
- Wait--常见的等待类型
--==================================================================================--SLEEP_BPOOL_FL ...
- Django ajax方法提交表单,及后端接受数据
前台代码: {% block content %} <div class="wrapper wrapper-content"> <div class=" ...