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-创建型-抽象工厂>

在Python中使用创建性设计模式的技巧,例如抽象工厂;抽象工厂的引用案例可以简单写出来:
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()

这是一种比较差劲的实现方式,随着需求的增加,工厂也会增加;但是工厂里面附加的类也会变得越来越多,而且其中的代码重复率会上升;就像上面两个类的方法之间,唯一的区别就是在于方法返回的对象不一样而已,一种更加优秀的方式,就是将里面类本身嵌入到方法中。(例如下面,同样的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()
这种方式也就是讲其余类嵌入到工厂类里面,而且在外部调用的时候不用创建工厂的对象,而是直接将类名传入进去就可以了;通过这种方式,然后会多态的调用各个工厂下面的工具(类)生成想要的东西。

<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
原创粉丝点击