Python的惯用法技巧和创建型设计模式
来源:互联网 发布:淘宝客服大概多少工资 编辑:程序博客网 时间:2024/05/17 08:34
惯用法
7.在python中使用assert语句的时候注意不能滥用.一般情况下不能用于异常处理和检查用户输入;可以用来确认函数的返回值是否合理,以及用于确定业务逻辑的先决条件的时候可以用Assert语句。
8.交换数据别需要使用第三个变量,直接使用x,y = y,x;通过这种方式能加快运行速度。
9.充分利用Lazy evaluation(这个我经常使用)
10.在python使用枚举的时候尽量小心(尽量少用,低版本没有支持枚举,3.4以后才加入关键字),因为不是原生支持枚举,所以在使用起来的时候会出现很多意义不明的操作,而不会出现错误提示。
11.如非必要,别使用type进行检查,因为无法识别父类子类之间关系,最好是使用isinstance关键字代替。
12.别使用eval(),没有任何理由让你使用它。
13.使用enumerate来获取迭代的索引和值,而且也可以实现自己的enumerate:
def myEnumerate(data):
n = 0
for elem in data:
yield n, elem
n = n + 1
14. 在python下经常会遇到编码格式的问题,这个时候只要通过将原有格式转换成UTF-8,然后再将其转换成所需要的格式就可以,具体的应用如下:(先到UTF,再到GBK)
str = ('hello'.decode("utf-8")).encode("gbk")
<1-创建型-抽象工厂>
class cmdDialogFactory:
def make_diag(self, width, height):
return Dialog(width, height)
def make_rectangle(self, x, y, width, height, fill='white', stroke='black'):
return Rectangle(x, y, width, height, fill, stroke)
def make_text(self, x, y, text, fontsize = 12)
return Text(x, y, text, fontsize)
class svgDialogFactory(cmdDialogFactory):
def make_diag(self, width, height):
return svgDialog(width, height)
def make_rectangle(self, x, y, width, height, fill='white', stroke='black'):
return svgRectangle(x, y, width, height, fill, stroke)
def make_text(self, x, y, text, fontsize = 12)
return svgText(x, y, text, fontsize)
def create_dialog(factory):
diag = factory.make_diag(30, 7)
rectangle = factory.make_rectangle(4, 1, 22, 5, 'yellow')
text = factory.make_text(7, 3, 'Abstract Factory')
diag.add(rectangle)
diag.add(text)
return diag
def main:
cmdDialog = create_dialog(cmdDialogFactory()) #使用不同的类工厂来建立对象
cmdDialog.show()
svgDialog = create_dialog(svgDialogFactory()) #这个类可以是上一个的子女或者兄弟
cmdDialog.show()
def make_diag(self, width, height):
return Dialog(width, height)
def make_rectangle(self, x, y, width, height, fill='white', stroke='black'):
return Rectangle(x, y, width, height, fill, stroke)
def make_text(self, x, y, text, fontsize = 12)
return Text(x, y, text, fontsize)
class svgDialogFactory(cmdDialogFactory):
def make_diag(self, width, height):
return svgDialog(width, height)
def make_rectangle(self, x, y, width, height, fill='white', stroke='black'):
return svgRectangle(x, y, width, height, fill, stroke)
def make_text(self, x, y, text, fontsize = 12)
return svgText(x, y, text, fontsize)
def create_dialog(factory):
diag = factory.make_diag(30, 7)
rectangle = factory.make_rectangle(4, 1, 22, 5, 'yellow')
text = factory.make_text(7, 3, 'Abstract Factory')
diag.add(rectangle)
diag.add(text)
return diag
def main:
cmdDialog = create_dialog(cmdDialogFactory()) #使用不同的类工厂来建立对象
cmdDialog.show()
svgDialog = create_dialog(svgDialogFactory()) #这个类可以是上一个的子女或者兄弟
cmdDialog.show()
这是一种比较差劲的实现方式,随着需求的增加,工厂也会增加;但是工厂里面附加的类也会变得越来越多,而且其中的代码重复率会上升;就像上面两个类的方法之间,唯一的区别就是在于方法返回的对象不一样而已,一种更加优秀的方式,就是将里面类本身嵌入到方法中。(例如下面,同样的cmdDialogFactory和svgDialogFactory)
#这里直接调用实际的类,如果是子类的话,Class就会变成子类;和C++中的多态相识
class cmdDialogFactory:
@classmethod
def make_diag(Class, width, height):
return Class.Dialog(width, height)
@classmethod
def make_rectangle(Class, x, y, width, height, fill='white', stroke='black'):
return Class.Rectangle(x, y, width, height, fill, stroke)
@classmethod
def make_text(Class, x, y, text, fontsize = 12):
return Class.Text(x, y, text, fontsize)
class Text:
pass
class Dialog:
pass
class svgDialogFactory(cmdDialogFactory):
class Text:
pass
class Dialog:
pass
def main:
cmdDialog = create_dialog(cmdDialogFactory) #使用了类方法,所以不用创建对象
cmdDialog.show()
svgDialog = create_dialog(svgDialogFactory)
cmdDialog.show()
cmdDialog = create_dialog(cmdDialogFactory) #使用了类方法,所以不用创建对象
cmdDialog.show()
svgDialog = create_dialog(svgDialogFactory)
cmdDialog.show()
这种方式也就是讲其余类嵌入到工厂类里面,而且在外部调用的时候不用创建工厂的对象,而是直接将类名传入进去就可以了;通过这种方式,然后会多态的调用各个工厂下面的工具(类)生成想要的东西。
<1-创建型-建造者>
基本相同,只有一个特别显著的不同点:
抽象工厂的方法是针对相同的接口,能创建不同的对象;而建造者的方法则是针对相同的接口,有不同的实现。
<1-创建型-简单工厂>
同样作为创建型设计模式,简单工厂也许就是一个函数的大小,但是却能通过传入不同的参数来创建不同的对象,举个案例来说明,就是使用一个工厂函数来创建一副棋盘。而棋盘里面的不同棋子,都是有相同父类,但是不同类型的对象.
在这上面那个案例中就可以应用到工厂模式,至于实例有非常多,所以不举.不过书中介绍的其他东西很值得学习,例如批量创建类:
eg:
for name in names:
new = make_new_method(char)
Class = type(name, (Piece), dict(__slots__=(),__new__=new))
globals()[name] = Class
其中Piece为父类的名字,__slots__和__new__这两个方法,一个是用来说不会出现任何数据,一个是用来指定new函数的。最后一行是用来在全局环境中指定,这样方便查找(可加可不加)。
<1-创建型-原型模型>
根据现有对象,创建一个新的对象并且对其进行修改。
这个模型在python里面有内置支持,也就是通过使用 Object = object.__class__(),来进行获取,这个是修改时才会进行真正的深拷贝的写时技术。
其中Object是对象名,object是原有对象,__class__()这个则是初始化构造函数.
<1-创建型-单例模型>
这个模型在python有模块进行支持,只要继承这个模块就自然变成单例了Singleton。或者通过装饰者模型来修饰类,变成单例,方法太多不用说了
0 0
- Python的惯用法技巧和创建型设计模式
- 一些Python的惯用法和小技巧:Pythonic
- Python的创建型设计模式之工厂设计模式
- 面向模式的软件体系结构+卷1_4(设计模式与惯用法)
- Python的创建型设计模式之建造者模式
- Python设计模式1-创建型模式
- python设计模式1:创建型模式
- 设计模式之pimpl惯用法C++版
- NET设计规范三:类型和类型成员设计的约定和惯用法
- Python的创建型设计模式之原型模式与单例模式
- python正则表达式惯用法
- python正则表达式惯用法
- python字符编码惯用法
- C++惯用法:奇特的递归模板模式
- 六种创建型设计模式的比较和总结
- python创建型设计模式——建造者模式
- 减少编译时依赖的意义和一些惯用法
- 设计模式之pimpl惯用法C语言版(城门失火 殃及池鱼)
- Android之Handler用法总结
- Android4.x 如何处理Power按键
- HDU 2204 - Eddy's爱好 (容斥原理)
- Android学习笔记(一)
- Python标准库:内置函数compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
- Python的惯用法技巧和创建型设计模式
- java中ImageIO.write(bufferedImage输出图片时,图片的改变问题
- lua how to
- 关于cssHack
- CString类型字符串,转换到 BYTE类型
- 全局变量如果不初始化,则默认为0,编译时编译器不提示“变量未初始化”
- Struts2内置校验器
- 通过java访问HDFS
- 如何数据保存成16进制