Python的惯用法技巧和创建型设计模式

惯用法

     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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值