惯用法
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。或者通过装饰者模型来修饰类,变成单例,方法太多不用说了