SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
+	
  

论  Python  与设计模式  
赖勇浩(http://laiyonghao.com)	
  
2013-­‐12-­‐8	
  
珠海	
  
+	
  
设计模式?  
+	
  
自我介绍  
n 
n 

赖勇浩	
  
从业  8  年多,主要编程语言是  
Python	
  

n 

game	
  -­‐>	
  webgame	
  -­‐>	
  web	
  

n 

常在珠三角技术沙龙出没	
  

n 

http://laiyonghao.com	
  

3	
  
+	
  
PyCon	
  的老朋友  

4	
  
+
好,正式开始吧!  

5	
  
+	
  
先热热场子……  
n 

写  Python	
  代码赚钱的,有没有?	
  

6	
  
+	
  
先热热场子……  
n 

写  Python	
  代码赚钱的,有没有?	
  

n 

写  Python  超过  1  年的,有没有?	
  

7	
  
+	
  
再热热场子……  
n 

读过《设计模式——可复用面向对
象软件的基础》这本书的有没有?	
  

8	
  
+	
  
再热热场子……  
n 

n 

读过《设计模式——可复用面向对
象软件的基础》这本书的有没有?	
  

读过《Head	
  First  设计模式》
的有没有?	
  

9	
  
10	
  

一个观点  
+	
  

我也希望是这样……  
但事实是……  

11	
  
+	
  
先看事实:工厂函数(方法)  
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(…)  
+	
  
先看事实:享元(FlyWeight)  
>>>	
  i	
  =	
  10	
  
>>>	
  j	
  =	
  5	
  +	
  5	
  
>>>	
  id(i)	
  
140479275503872	
  
>>>	
  id(j)	
  
140479275503872	
  
>>>	
  a	
  =	
  'ab'	
  
>>>	
  b	
  =	
  'a'	
  +	
  'b'	
  
>>>	
  id(a)	
  ==	
  id(b)	
  
True	
  

13	
  
+	
  
先看事实:享元(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	
  
+	
  
先看事实:适配器  
import	
  SocketServer	
  
class	
  ThreadedTCPServer(SocketServer.ThreadingMixIn,	
  
SocketServer.TCPServer):	
  
	
  	
  	
  	
  pass	
  
  

15	
  
+	
  
先看事实:代理模式  
>>>	
  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	
  
+	
  
先看事实:模板方法  
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	
  
+	
  
先看事实:模板方法  
From	
  abc	
  import	
  ABCMeta	
  
class	
  C:	
  
	
  	
  	
  	
  __metaclass__	
  =	
  ABCMeta	
  
	
  	
  	
  	
  @abstractmethod	
  
	
  	
  	
  	
  def	
  my_abstract_method(self,	
  ...):	
  
	
  	
  	
  	
  	
  	
  	
  	
  ...  

18	
  
+	
  
所以,真相是……  
n  标准库都在用……	
  
n  标准库都推荐用……	
  
n  怎么可以说不需要?!	
  

19	
  
20	
  

+	
  	
  

所以我们不是不需要模式……  
而是要  Pythonic  的模式实现……  
+	
  
不  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	
  
+	
  
单例的三个需求:  
n 

只能有一个实例;	
  

n 

它必须自行创建这个实例;	
  

n 

它必须自行向整个系统提供这个
实例。	
  

22	
  
+	
  
单例遇上并行  
class	
  Singleton(object):	
  
	
  	
  	
  	
  objs	
  	
  =	
  {}	
  
	
  	
  	
  	
  objs_locker	
  =	
  	
  threading.Lock()	
  
	
  	
  	
  	
  def	
  __new__(cls,	
  *args,	
  **kv):	
  
	
  	
  	
  	
  	
  	
  	
  	
  if	
  cls	
  in	
  cls.objs:	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  cls.objs[cls]	
  

23	
  
+	
  
单例遇上并行  
	
  	
  	
  	
  	
  	
  	
  	
  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	
  
+	
  
Pythonic	
  的设计模式:单例  
n 

重新审视  Python  的语法元素,尽量利用已有基础设施。	
  

n 

模块	
  
n 
n 
n 

n 

所有的变量都会绑定到模块;  
模块只初始化一次;	
  
import	
  机制是线程安全的(保证了在并发状态下模块也只有一个实
例);  

惯用法:	
  
n 

文件名首字母大写,如  Moon.py	
  

n 

__all__  

25	
  
+	
  
不  Pythonic  的设计模式:装饰器  

26	
  
+	
  
代码大概是这样的  
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	
  
+	
  
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	
  
+	
  
其它设计模式:Borg(MonoState)  
n 

保持对象的唯一性并不重要,只
要共享状态就行	
  

n 

Alex	
  Martelli	
  

n 

http://
code.activestate.com/
recipes/66531/	
  

29	
  
+	
  
其它设计模式: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	
  
+	
  
动态语言特有的设计模式:mixin  
n 

动态地改变实例的类型的基类,在不修改生成实例过程的情况下,
给实例增加(改变)功能。可用以实现插件框架。	
  

class	
  Bird(object):pass	
  
bird	
  =	
  Bird()	
  
class	
  FlyMixin:	
  
	
  	
  def	
  fly(self):print	
  'I	
  can	
  fly.'	
  
bird.__class__.__bases__	
  +=	
  (FlyMixin,	
  )	
  
bird.fly()	
  

31	
  
+	
  
动态语言特有的模式:duck	
  typing  
n 

n 

n 

一个对象有效的语义,不是由继承自特定的类或实现特定的接口,
而是由当前方法和属性的集合决定。	
  
当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,
那么这只鸟就可以被称为鸭子。(James	
  Whitcomb	
  Riley)	
  
干掉模板方法?	
  
n 

不,模板方法是想要保证子类实现接口  

32	
  
+	
  
利用设计模式提供更好的接口  
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	
  
+	
  
docopt  

34	
  
+	
  
解释器模式的应用  
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	
  
+

Q&A  
mail@laiyonghao.com	
  
  

36	
  

Mais conteúdo relacionado

Mais procurados

OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
 
Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望jeffz
 
Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望jeffz
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and nodePeter Yi
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门Lucien Li
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程zhangdaiping
 
C++11综述/新特性描述/Overview of C++11 New Features
C++11综述/新特性描述/Overview of C++11 New FeaturesC++11综述/新特性描述/Overview of C++11 New Features
C++11综述/新特性描述/Overview of C++11 New FeaturesPeien Luo
 
jQuery源码学习
jQuery源码学习jQuery源码学习
jQuery源码学习fangdeng
 
Advanced heap exploitaion
Advanced heap exploitaionAdvanced heap exploitaion
Advanced heap exploitaionAngel Boy
 
用Cython封装c++代码为python模块的一点经验
用Cython封装c++代码为python模块的一点经验用Cython封装c++代码为python模块的一点经验
用Cython封装c++代码为python模块的一点经验Leo Zhou
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验QLeelulu
 
Python 入门
Python 入门Python 入门
Python 入门kuco945
 
Python learn guide
Python learn guidePython learn guide
Python learn guiderobin yang
 
JAVA内存泄漏及诊断
JAVA内存泄漏及诊断JAVA内存泄漏及诊断
JAVA内存泄漏及诊断ivannotes
 
Effective java 摘選條目分享 1 - 物件、複合、可變性、leak
Effective java   摘選條目分享 1 - 物件、複合、可變性、leakEffective java   摘選條目分享 1 - 物件、複合、可變性、leak
Effective java 摘選條目分享 1 - 物件、複合、可變性、leakKane Shih
 

Mais procurados (19)

OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
 
Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望
 
Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望
 
Node way
Node wayNode way
Node way
 
180518 ntut js and node
180518 ntut js and node180518 ntut js and node
180518 ntut js and node
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
 
ios分享
ios分享ios分享
ios分享
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
 
C++11综述/新特性描述/Overview of C++11 New Features
C++11综述/新特性描述/Overview of C++11 New FeaturesC++11综述/新特性描述/Overview of C++11 New Features
C++11综述/新特性描述/Overview of C++11 New Features
 
Ooredis
OoredisOoredis
Ooredis
 
jQuery源码学习
jQuery源码学习jQuery源码学习
jQuery源码学习
 
Advanced heap exploitaion
Advanced heap exploitaionAdvanced heap exploitaion
Advanced heap exploitaion
 
用Cython封装c++代码为python模块的一点经验
用Cython封装c++代码为python模块的一点经验用Cython封装c++代码为python模块的一点经验
用Cython封装c++代码为python模块的一点经验
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
 
Python 入门
Python 入门Python 入门
Python 入门
 
Python learn guide
Python learn guidePython learn guide
Python learn guide
 
JAVA内存泄漏及诊断
JAVA内存泄漏及诊断JAVA内存泄漏及诊断
JAVA内存泄漏及诊断
 
Effective java 摘選條目分享 1 - 物件、複合、可變性、leak
Effective java   摘選條目分享 1 - 物件、複合、可變性、leakEffective java   摘選條目分享 1 - 物件、複合、可變性、leak
Effective java 摘選條目分享 1 - 物件、複合、可變性、leak
 
Java Thread
Java ThreadJava Thread
Java Thread
 

Semelhante a 论 Python 与设计模式。

C++工程实践
C++工程实践C++工程实践
C++工程实践Shuo Chen
 
Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)ChengHui Weng
 
ES5 introduction
ES5 introductionES5 introduction
ES5 introductionotakustay
 
竞赛中C++语言拾遗
竞赛中C++语言拾遗竞赛中C++语言拾遗
竞赛中C++语言拾遗乐群 陈
 
xwz 2010-10-31
xwz 2010-10-31xwz 2010-10-31
xwz 2010-10-31carlxwz
 
电子杂志(试刊)
电子杂志(试刊)电子杂志(试刊)
电子杂志(试刊)ProCharm
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程deer hope
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代scott liao
 
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹Johnny Sung
 
Open whisk quick start guide
Open whisk quick start guideOpen whisk quick start guide
Open whisk quick start guideJoseph Chang
 
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509tidesq
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试lydiafly
 

Semelhante a 论 Python 与设计模式。 (20)

C++工程实践
C++工程实践C++工程实践
C++工程实践
 
Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)
 
Ch10
Ch10Ch10
Ch10
 
Ch10 教學
Ch10 教學Ch10 教學
Ch10 教學
 
ES5 introduction
ES5 introductionES5 introduction
ES5 introduction
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
竞赛中C++语言拾遗
竞赛中C++语言拾遗竞赛中C++语言拾遗
竞赛中C++语言拾遗
 
xwz 2010-10-31
xwz 2010-10-31xwz 2010-10-31
xwz 2010-10-31
 
电子杂志(试刊)
电子杂志(试刊)电子杂志(试刊)
电子杂志(试刊)
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
DevOpsDays Taipei 2018 - Puppet 古早味、新感受:改造老牌企業進入自動化時代
 
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
 
Open whisk quick start guide
Open whisk quick start guideOpen whisk quick start guide
Open whisk quick start guide
 
Ch10 習題
Ch10 習題Ch10 習題
Ch10 習題
 
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
 
Ppt 127-135
Ppt 127-135Ppt 127-135
Ppt 127-135
 
Glider
GliderGlider
Glider
 
Ppt 127-135
Ppt 127-135Ppt 127-135
Ppt 127-135
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 

Mais de 勇浩 赖

一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构勇浩 赖
 
2012,我的技术之选
2012,我的技术之选2012,我的技术之选
2012,我的技术之选勇浩 赖
 
珠三角技术沙龙广州场
珠三角技术沙龙广州场珠三角技术沙龙广州场
珠三角技术沙龙广州场勇浩 赖
 
为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?勇浩 赖
 
Behavior+tree+ai lite
Behavior+tree+ai liteBehavior+tree+ai lite
Behavior+tree+ai lite勇浩 赖
 
敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法勇浩 赖
 
先用再学 - 借助 Xna 快速开发游戏原型
先用再学  - 借助 Xna 快速开发游戏原型先用再学  - 借助 Xna 快速开发游戏原型
先用再学 - 借助 Xna 快速开发游戏原型勇浩 赖
 
关于Bitworld的一些话题222
关于Bitworld的一些话题222关于Bitworld的一些话题222
关于Bitworld的一些话题222勇浩 赖
 
03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏勇浩 赖
 
06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源勇浩 赖
 
07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪勇浩 赖
 
01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做勇浩 赖
 
如何做好沙龙演讲
如何做好沙龙演讲如何做好沙龙演讲
如何做好沙龙演讲勇浩 赖
 
虚拟世界是怎么炼成的(图片版)
虚拟世界是怎么炼成的(图片版)虚拟世界是怎么炼成的(图片版)
虚拟世界是怎么炼成的(图片版)勇浩 赖
 
Techparty story
Techparty storyTechparty story
Techparty story勇浩 赖
 

Mais de 勇浩 赖 (20)

一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构
 
Tp web
Tp webTp web
Tp web
 
2012,我的技术之选
2012,我的技术之选2012,我的技术之选
2012,我的技术之选
 
Scala
ScalaScala
Scala
 
珠三角技术沙龙广州场
珠三角技术沙龙广州场珠三角技术沙龙广州场
珠三角技术沙龙广州场
 
为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?
 
Behavior+tree+ai lite
Behavior+tree+ai liteBehavior+tree+ai lite
Behavior+tree+ai lite
 
敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法
 
先用再学 - 借助 Xna 快速开发游戏原型
先用再学  - 借助 Xna 快速开发游戏原型先用再学  - 借助 Xna 快速开发游戏原型
先用再学 - 借助 Xna 快速开发游戏原型
 
关于Bitworld的一些话题222
关于Bitworld的一些话题222关于Bitworld的一些话题222
关于Bitworld的一些话题222
 
Stekin
StekinStekin
Stekin
 
03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏
 
abu.rpc intro
abu.rpc introabu.rpc intro
abu.rpc intro
 
06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源
 
07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪
 
01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做
 
Python 温故
Python 温故Python 温故
Python 温故
 
如何做好沙龙演讲
如何做好沙龙演讲如何做好沙龙演讲
如何做好沙龙演讲
 
虚拟世界是怎么炼成的(图片版)
虚拟世界是怎么炼成的(图片版)虚拟世界是怎么炼成的(图片版)
虚拟世界是怎么炼成的(图片版)
 
Techparty story
Techparty storyTechparty story
Techparty story
 

论 Python 与设计模式。