您的位置:首页 > 编程语言 > Python开发

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

2020-02-02 18:15 459 查看
惯用法      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。或者通过装饰者模型来修饰类,变成单例,方法太多不用说了
  • 点赞
  • 收藏
  • 分享
  • 文章举报
爱金币的书虫 发布了6 篇原创文章 · 获赞 0 · 访问量 6596 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: