python中的单例和异常处理
一、单例
设计模式:
设计模式是前人的总结和经验的提炼,通常,被人人们广为流传的设计模式都是针对某一特定问题的成熟解决方案
单例设计模式
单例:让类创建的对象,在系统中有唯一的实例
1、示例:
创建对象的时候:
1)为对象分配空间:__new__()
创建对象的时候,python解释器首先会调用__new__方法为对象分配空间
__new__是一个由object基类提供的内置的静态方法,主要有两个作用:
在内存中为对象分配空间
返回对象的引用
2)对象初始化 :__init__()
python解释器获得对象的引用后,将引用的第一个参数,传递给__init__方法
运行结果为:
第一个参数cls:哪一个类调用就传递哪一个类
第二个参数*args:是一个多值元组参数
第三个参数**kwargs:是一个多值的字典参数
2、重写__new__方法的代码非常固定:
继承自父类方法
返回父类方法调用_new__方法的结果
重写__new__方法一定要return object.__new__(cls)
否则python的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
python中的单例:
单例:让类创建的对象,在系统中只有唯一的一个实例
1.定义一个类属性,初始值时None,用于记录单例对象的引用(因为当一个类定义完成运行程序的时候,
内存中有这个类创建的对象吗?
并没有,我们需要调用创建对象的方法,内存中才会有第一个对象)
2.重写__new__方法
3.如果类属性is None,调用父类方法分配空间,并在类属性中记录结果
4.返回类属性中记录的对象引用
示例:
运行结果为:
3、只执行一次初始化工作
在每次使用 类名() 创建对象时,python的解释器都会自动调用两个方法
__new__ 分配空间
__init__ 对象初始化
但在上一小结中 __new__方法改造之后,每次都会得到第一次被创建对象的引用
但是:初始化方法还会被再次掉用
需求:让初始化方法只执行一次
解决办法:
1.定义一个类属性init_flag标记是否执行过初始化动作,初始值为false
2.在__init__方法中,判断init_flag,如果为false就执行初始化动作
3.然后将init_flag设置为true
4.这样,再次自动调用__init__方法时,初始化动作就不会再次被执行了
示例:
运行结果如下:
二、异常
程序在运行的时候,如果python解释器遇到一个错误,会停止程序的执行,
并且提示一些错误的信息,这就是异常
我们在程序开发的时候,很难将所有的特殊情况都处理,通过异常捕获可以针对
突发事件做集中处理,从而保证程序的健壮性和稳定性
捕获异常的方法:
在程序开发中,如果对某些代码的执行不能确定(程序语法完全正确)
可以增加try来捕获异常。
1、单个异常
格式如下:
try:
尝试执行的代码
except:
出现错误的处理
比如出现如下的异常:
捕获异常:
运行结果如下:
2、多个异常
如果一个程序有多个异常,在except后边应该写上异常的类型
当python解释器抛出异常时,最后一行提示的第一个单词就是错误类型
根据错误类型来捕获异常
格式如下:
try:
尝试执行的代码
except 错误类型1:
针对错误类型1,对应的代码处理
except 错误类型2:
针对错误类型2,对应的代码处理
...
示例:
需求:
1.提示用户输入一个整数
2.使用8除以用户输入的整数并输出
运行结果1:
运行结果2:
3、捕获未知异常
在开发的时候,要判断所有可能出现的错误,是很难做到的
如果希望程序无论出现任何错误,都不会因为python解释器抛出异常而终止,可以再增加一个except
运行结果:
4、一个完整的异常捕获
格式如下:
try:
尝试执行的代码
except 错误类型1:
except 错误类型2:
except Exception as result:
else:
没有异常才会执行的代码
finally:
无论是否有异常,都会执行的代码
运行结果1:
运行结果2:
5、主动抛出异常
需求
提示用户输入密码,如果长度小于8,就抛出异常
运行结果1:
运行结果2:
6、异常的传递
函数的错误:一级一级的去找,最终会将异常传递到主程序里面
结果如下:
7、断言
可以理解为提前预言,让人更好的知道错误的原因
提前预言div不能为0