单例
单例设计模式
设计模式是前人工作的总结和提炼,通常被人们广为流传的设计模式都是针对某一特定问题的成熟的解决方案
使用设计模式是为了可重用代码,使代码更容易被他人理解、保证代码的可靠性
单例设计模式:
目的- -让类创建的对象在系统中只有唯一的一个实例
每一次执行 类名() 返回的对象,内存地址都是相同的
__new__
方法
使用 类名() 创建对象时,python 的解释器首先会调用 __new__
方法分配空间
__new__
是一个由 object 基类提供的 内置的静态方法,主要作用有两个:
1.在内存中为对象分配空间
2.返回对象的引用
python 的解释器获得对象的引用后,将引用作为第一个参数,传递给__init__
方法
重写 __new__
方法的代码非常固定!
重写__new__
方法一定要 return super().__new__(cls)
否则 python 的解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法
注意:__new__
是一个静态方法,在调用时需要主动传递cls
参数
异常
异常的概念
程序在运行时,如果 python 解释器遇到了一个错误,会停止程序的执行,并且提示一些错误信息,这就是异常
程序停止执行并且提示错误信息这个动作,我们通常称之为:抛出(raise)异常
程序开发时,很难将所有的特殊情况处理的面面俱到,通过异常捕捉可以针对突发事件做集中处理,从而保证程序的稳定性和健壮性
捕获异常
在程序开发时如果对某些代码的执行不能确定是否正确,可以增加 try(尝试)
来捕捉异常
捕捉异常最简单的语法格式:
try:
尝试执行的代码
except:
出现错误的处理
try 下方编写要尝试的代码,不确定是否能够正常执行的代码
except 下方编写尝试失败的代码
在执行程序时 可能会遇到不同类型的异常,并且要针对不同的异常做出不同的响应,这个时候就需要捕捉错误类型了
语法:
try:
# 尝试运行的代码
pass
except 错误类型1:
# 根据错误类型1做出的处理
pass
except 错误类型2:
# 根据错误类型2做出的处理
pass
except (错误类型3, 错误类型4):
pass
except Exception as result:
print("未知错误 % s" % result)
当 python 解释器抛出异常时,最后一行错误信息的第一个单词就是错误类型
捕获未知错误
在开发时要预判到所有可能出现的错误还是有些困难的
如果希望程序无论出现任何错误,都不会因为 python 解释器抛出异常而被终止,可以再增加一个 expect
语法:
except Exception as result:
print("未知错误 % s" % result)
异常捕获的完整语法
try:
# 尝试运行的代码
pass
except 错误类型1:
# 根据错误类型1做出的处理
pass
except 错误类型2:
# 根据错误类型2做出的处理
pass
except (错误类型3, 错误类型4):
pass
except Exception as result:
print("未知错误 % s" % result)
else:
# 没有异常才会执行的代码
pass
finally:
# 无论是否有异常都会执行的代码
print("无论是否有异常都会执行的代码")
else 只有在没有异常时才会执行的代码
finally 无论是否有异常都会执行的代码
异常的传递性
当函数或方法执行出现异常时,会将异常传递给函数或方法的一方
如果传递到主程序,仍然没有异常处理程序才会被终止
提示
在开发中,可以在主函数中增加异常捕获
而在主函数中调用其他函数,只要出现异常,都会传递到主函数的异常捕获中
这样就不需要在代码中增加过多的异常捕获,能保证代码的整洁
抛出 raise 异常
在开发中,除了代码执行出错,python 解释器会抛出异常之外
还可以根据应用程序特有的业务需求主动抛出异常
当前函数只负责提示用户输入密码,如果密码长度不正确,需要其他的函数进行额外的处理,因此可以抛出异常,由其他需要处理的函数捕获异常
def input_password:
pwd = input("请输入密码:")
if len(pwd) >= 8:
return pwd
print("主动抛出异常")
# 创建异常对象
ex = Exception("密码长度不够")
# 主动抛出异常
raise ex
try:
print(input_password())
except Exception as result:
print(result)