Enviar pesquisa
Carregar
论 Python 与设计模式。
•
4 gostaram
•
1,853 visualizações
勇浩 赖
Seguir
pycon china 2013 zhuhai。珠海场讲稿。
Leia menos
Leia mais
Tecnologia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 36
Baixar agora
Baixar para ler offline
Recomendados
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式
勇浩 赖
Python 于 webgame 的应用
Python 于 webgame 的应用
勇浩 赖
Wind.js无障碍调试与排错
Wind.js无障碍调试与排错
jeffz
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
Justin Lin
合久必分,分久必合
合久必分,分久必合
Qiangning Hong
The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)
jeffz
Python速成指南
Python速成指南
March Liu
JavaScript现代化排错实践
JavaScript现代化排错实践
jeffz
Recomendados
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式
勇浩 赖
Python 于 webgame 的应用
Python 于 webgame 的应用
勇浩 赖
Wind.js无障碍调试与排错
Wind.js无障碍调试与排错
jeffz
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
Justin Lin
合久必分,分久必合
合久必分,分久必合
Qiangning Hong
The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)
jeffz
Python速成指南
Python速成指南
March Liu
JavaScript现代化排错实践
JavaScript现代化排错实践
jeffz
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
Justin Lin
Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望
jeffz
Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望
jeffz
Node way
Node way
Ethan Zhang
180518 ntut js and node
180518 ntut js and node
Peter Yi
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
Lucien Li
ios分享
ios分享
Lucien Li
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
zhangdaiping
C++11综述/新特性描述/Overview of C++11 New Features
C++11综述/新特性描述/Overview of C++11 New Features
Peien Luo
Ooredis
Ooredis
iammutex
jQuery源码学习
jQuery源码学习
fangdeng
Advanced heap exploitaion
Advanced heap exploitaion
Angel Boy
用Cython封装c++代码为python模块的一点经验
用Cython封装c++代码为python模块的一点经验
Leo Zhou
Node.js开发体验
Node.js开发体验
QLeelulu
Python 入门
Python 入门
kuco945
Python learn guide
Python learn guide
robin yang
JAVA内存泄漏及诊断
JAVA内存泄漏及诊断
ivannotes
Effective java 摘選條目分享 1 - 物件、複合、可變性、leak
Effective java 摘選條目分享 1 - 物件、複合、可變性、leak
Kane Shih
Java Thread
Java Thread
艾鍗科技
C++工程实践
C++工程实践
Shuo Chen
Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)
ChengHui Weng
Ch10
Ch10
Alisha Smile
Mais conteúdo relacionado
Mais procurados
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
Justin Lin
Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望
jeffz
Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望
jeffz
Node way
Node way
Ethan Zhang
180518 ntut js and node
180518 ntut js and node
Peter Yi
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
Lucien Li
ios分享
ios分享
Lucien Li
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
zhangdaiping
C++11综述/新特性描述/Overview of C++11 New Features
C++11综述/新特性描述/Overview of C++11 New Features
Peien Luo
Ooredis
Ooredis
iammutex
jQuery源码学习
jQuery源码学习
fangdeng
Advanced heap exploitaion
Advanced heap exploitaion
Angel Boy
用Cython封装c++代码为python模块的一点经验
用Cython封装c++代码为python模块的一点经验
Leo Zhou
Node.js开发体验
Node.js开发体验
QLeelulu
Python 入门
Python 入门
kuco945
Python learn guide
Python learn guide
robin yang
JAVA内存泄漏及诊断
JAVA内存泄漏及诊断
ivannotes
Effective java 摘選條目分享 1 - 物件、複合、可變性、leak
Effective java 摘選條目分享 1 - 物件、複合、可變性、leak
Kane Shih
Java Thread
Java Thread
艾鍗科技
Mais procurados
(19)
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望
Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望
Node way
Node way
180518 ntut js and node
180518 ntut js and node
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
ios分享
ios分享
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
C++11综述/新特性描述/Overview of C++11 New Features
C++11综述/新特性描述/Overview of C++11 New Features
Ooredis
Ooredis
jQuery源码学习
jQuery源码学习
Advanced heap exploitaion
Advanced heap exploitaion
用Cython封装c++代码为python模块的一点经验
用Cython封装c++代码为python模块的一点经验
Node.js开发体验
Node.js开发体验
Python 入门
Python 入门
Python learn guide
Python learn guide
JAVA内存泄漏及诊断
JAVA内存泄漏及诊断
Effective java 摘選條目分享 1 - 物件、複合、可變性、leak
Effective java 摘選條目分享 1 - 物件、複合、可變性、leak
Java Thread
Java Thread
Semelhante a 论 Python 与设计模式。
C++工程实践
C++工程实践
Shuo Chen
Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)
ChengHui Weng
Ch10
Ch10
Alisha Smile
Ch10 教學
Ch10 教學
hungchiayang1
ES5 introduction
ES5 introduction
otakustay
getPDF.aspx
getPDF.aspx
byron zhao
getPDF.aspx
getPDF.aspx
byron zhao
竞赛中C++语言拾遗
竞赛中C++语言拾遗
乐群 陈
xwz 2010-10-31
xwz 2010-10-31
carlxwz
电子杂志(试刊)
电子杂志(试刊)
ProCharm
C++模板与泛型编程
C++模板与泛型编程
deer hope
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
scott liao
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
Johnny Sung
Open whisk quick start guide
Open whisk quick start guide
Joseph Chang
Ch10 習題
Ch10 習題
hungchiayang1
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
tidesq
Ppt 127-135
Ppt 127-135
hungchiayang1
Glider
Glider
windyrobin
Ppt 127-135
Ppt 127-135
hungchiayang1
Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
Semelhante a 论 Python 与设计模式。
(20)
C++工程实践
C++工程实践
Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)
Ch10
Ch10
Ch10 教學
Ch10 教學
ES5 introduction
ES5 introduction
getPDF.aspx
getPDF.aspx
getPDF.aspx
getPDF.aspx
竞赛中C++语言拾遗
竞赛中C++语言拾遗
xwz 2010-10-31
xwz 2010-10-31
电子杂志(试刊)
电子杂志(试刊)
C++模板与泛型编程
C++模板与泛型编程
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
Open whisk quick start guide
Open whisk quick start guide
Ch10 習題
Ch10 習題
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Ppt 127-135
Ppt 127-135
Glider
Glider
Ppt 127-135
Ppt 127-135
Ecma script edition5-小试
Ecma script edition5-小试
Mais de 勇浩 赖
一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构
勇浩 赖
Tp web
Tp web
勇浩 赖
2012,我的技术之选
2012,我的技术之选
勇浩 赖
Scala
Scala
勇浩 赖
珠三角技术沙龙广州场
珠三角技术沙龙广州场
勇浩 赖
为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?
勇浩 赖
Behavior+tree+ai lite
Behavior+tree+ai lite
勇浩 赖
敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法
勇浩 赖
先用再学 - 借助 Xna 快速开发游戏原型
先用再学 - 借助 Xna 快速开发游戏原型
勇浩 赖
关于Bitworld的一些话题222
关于Bitworld的一些话题222
勇浩 赖
Stekin
Stekin
勇浩 赖
03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏
勇浩 赖
abu.rpc intro
abu.rpc intro
勇浩 赖
06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源
勇浩 赖
07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪
勇浩 赖
01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做
勇浩 赖
Python 温故
Python 温故
勇浩 赖
如何做好沙龙演讲
如何做好沙龙演讲
勇浩 赖
虚拟世界是怎么炼成的(图片版)
虚拟世界是怎么炼成的(图片版)
勇浩 赖
Techparty story
Techparty story
勇浩 赖
Mais de 勇浩 赖
(20)
一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构
Tp web
Tp web
2012,我的技术之选
2012,我的技术之选
Scala
Scala
珠三角技术沙龙广州场
珠三角技术沙龙广州场
为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?
Behavior+tree+ai lite
Behavior+tree+ai lite
敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法
先用再学 - 借助 Xna 快速开发游戏原型
先用再学 - 借助 Xna 快速开发游戏原型
关于Bitworld的一些话题222
关于Bitworld的一些话题222
Stekin
Stekin
03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏
abu.rpc intro
abu.rpc intro
06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源
07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪
01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做
Python 温故
Python 温故
如何做好沙龙演讲
如何做好沙龙演讲
虚拟世界是怎么炼成的(图片版)
虚拟世界是怎么炼成的(图片版)
Techparty story
Techparty story
论 Python 与设计模式。
1.
+ 论 Python
与设计模式 赖勇浩(http://laiyonghao.com) 2013-‐12-‐8 珠海
2.
+ 设计模式?
3.
+ 自我介绍 n n 赖勇浩
从业 8 年多,主要编程语言是 Python n game -‐> webgame -‐> web n 常在珠三角技术沙龙出没 n http://laiyonghao.com 3
4.
+ PyCon 的老朋友
4
5.
+ 好,正式开始吧! 5
6.
+ 先热热场子…… n 写
Python 代码赚钱的,有没有? 6
7.
+ 先热热场子…… n 写
Python 代码赚钱的,有没有? n 写 Python 超过 1 年的,有没有? 7
8.
+ 再热热场子…… n 读过《设计模式——可复用面向对 象软件的基础》这本书的有没有?
8
9.
+ 再热热场子…… n n 读过《设计模式——可复用面向对 象软件的基础》这本书的有没有?
读过《Head First 设计模式》 的有没有? 9
10.
10 一个观点
11.
+ 我也希望是这样…… 但事实是……
11
12.
+ 先看事实:工厂函数(方法) int(…)
datatime.fromtimestamp(…) float(…) Decimal.from_float(…) type(name, bases, dict) >>> class X(object): Fraction.from_float(…) ... a = 1 ... >>> X = type('X', (object,), dict(a=1)) collections.namedtuple() Fraction.from_decimal(…)
13.
+ 先看事实:享元(FlyWeight) >>>
i = 10 >>> j = 5 + 5 >>> id(i) 140479275503872 >>> id(j) 140479275503872 >>> a = 'ab' >>> b = 'a' + 'b' >>> id(a) == id(b) True 13
14.
+ 先看事实:享元(FlyWeight) >>>
i = 10 >>> a = a * 10 >>> j = 5 + 5 >>> intern(a) >>> id(i) 140479275503872 'abababababababababab' >>> b = 'abababababababababab’ >>> id(j) >>> c = 'abababababababababa' + 'b’ 140479275503872 >>> a = 'ab' >>> b = 'a' + 'b' >>> id(a) == id(b) True >>> d = 'ab' * 10 >>> id(a) == id(b) == id(c) == id(d) True 14
15.
+ 先看事实:适配器 import
SocketServer class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): pass 15
16.
+ 先看事实:代理模式 >>>
import weakref >>> a1 = weakref.proxy(a) >>> class A(object):pass >>> a1.attr ... 1 >>> a = A() >>> a1 >>> a.attr = 1 <weakproxy at 0x10dc375d0 to A at 0x10dc3a410> >>> a.attr 1 16
17.
+ 先看事实:模板方法 import
SocketServer class MyTCPHandler(SocketServer.BaseRequestHandler): def handle(self): self.data = self.request.recv(1024).strip() print "{} wrote:".format(self.client_address[0]) print self.data self.request.sendall(self.data.upper()) 17
18.
+ 先看事实:模板方法 From
abc import ABCMeta class C: __metaclass__ = ABCMeta @abstractmethod def my_abstract_method(self, ...): ... 18
19.
+ 所以,真相是…… n
标准库都在用…… n 标准库都推荐用…… n 怎么可以说不需要?! 19
20.
20 +
所以我们不是不需要模式…… 而是要 Pythonic 的模式实现……
21.
+ 不 Pythonic
的设计模式:单例 class Singleton(object): def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): orig = super(Singleton, cls) cls._instance = orig.__new__(cls, *args, **kw) return cls._instance 21
22.
+ 单例的三个需求: n 只能有一个实例;
n 它必须自行创建这个实例; n 它必须自行向整个系统提供这个 实例。 22
23.
+ 单例遇上并行 class
Singleton(object): objs = {} objs_locker = threading.Lock() def __new__(cls, *args, **kv): if cls in cls.objs: return cls.objs[cls] 23
24.
+ 单例遇上并行
cls.objs_locker.acquire() try: if cls in cls.objs: return cls.objs[cls] cls.objs[cls] = object.__new__(cls) finally: cls.objs_locker.release() 24
25.
+ Pythonic 的设计模式:单例
n 重新审视 Python 的语法元素,尽量利用已有基础设施。 n 模块 n n n n 所有的变量都会绑定到模块; 模块只初始化一次; import 机制是线程安全的(保证了在并发状态下模块也只有一个实 例); 惯用法: n 文件名首字母大写,如 Moon.py n __all__ 25
26.
+ 不 Pythonic
的设计模式:装饰器 26
27.
+ 代码大概是这样的 class
darkroast(Beverage): def cost(self):return 0.99 … class Whip(Beverage): def __init__(self, beverage): self._beverage = beverage def cost(self): return self._beverage.cost() + 0.1 print Whip(Mocha(darkroast())).cost() 27
28.
+ Pythonic 的设计模式:装饰器
def beverage(cost): def _(orig = 0.0): return orig + cost return _ darkroast = beverage(0.99) whip = beverage(0.1) mocha = beverage(0.2) print whip(mocha(darkroast())) 28
29.
+ 其它设计模式:Borg(MonoState) n 保持对象的唯一性并不重要,只 要共享状态就行
n Alex Martelli n http:// code.activestate.com/ recipes/66531/ 29
30.
+ 其它设计模式:Borg(MonoState) class
Borg(object): _state = {} def __new__(cls, *args, **kw): ob = super(Borg, cls).__new__(cls, *args, **kw) ob.__dict__ = cls._state return ob 30
31.
+ 动态语言特有的设计模式:mixin n 动态地改变实例的类型的基类,在不修改生成实例过程的情况下, 给实例增加(改变)功能。可用以实现插件框架。
class Bird(object):pass bird = Bird() class FlyMixin: def fly(self):print 'I can fly.' bird.__class__.__bases__ += (FlyMixin, ) bird.fly() 31
32.
+ 动态语言特有的模式:duck typing
n n n 一个对象有效的语义,不是由继承自特定的类或实现特定的接口, 而是由当前方法和属性的集合决定。 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子, 那么这只鸟就可以被称为鸭子。(James Whitcomb Riley) 干掉模板方法? n 不,模板方法是想要保证子类实现接口 32
33.
+ 利用设计模式提供更好的接口 n getopt
n optparse define interface for your command-‐line app, and n n Command-‐line interface description language n n n automatically generate parser for it. argparse docopt n 解释器模式 33
34.
+ docopt 34
35.
+ 解释器模式的应用 n GM
指令 player 0 money 10000 player 0 attack 10000 monster 0 die scene monsters die n 过场剧情脚本 monster 0 spawn 0,0 monster 0 moveto 0,-‐10 monster 0 attack monster 0 moveto 0,0 35
36.
+ Q&A mail@laiyonghao.com
36
Baixar agora