目录
单例:
单例设计模式
设计模式
- 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案
- 使用 设计模式 是为了可重用代码、让代码更容易被他人理解、保证代码可靠性
单例设计模式
- 目的 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例
- 每一次执行
类名()
返回的对象,内存地址是相同的
单例设计模式的应用场景
- 音乐播放 对象
- 回收站 对象
- 打印机 对象
__new__
方法
- 使用 类名() 创建对象时,
Python
的解释器 首先 会 调用__new__
方法为对象 分配空间 __new__
是一个 由object
基类提供的 内置的静态方法,主要作用有两个:- 1) 在内存中为对象 分配空间
- 2) 返回 对象的引用
Python
的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给__init__
方法
重写 __new__
方法
- 重写
__new__
方法 一定要return super().__new__(cls)
- 否则 Python 的解释器 得不到 分配了空间的 对象引用,就不会调用对象的初始化方法
- 注意:
__new__
是一个静态方法,在调用时需要 主动传递cls
参数
Python 中的单例
- 单例 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例
- 定义一个 类属性,初始值是
None
,用于记录 单例对象的引用 - 重写
__new__
方法 - 如果 类属性
is None
,调用父类方法分配空间,并在类属性中记录结果 - 返回 类属性 中记录的 对象引用
- 定义一个 类属性,初始值是
演示:
输出结果:两个A,B的地址是一样的
上述的示例有个不足,就是每次都会进行初始化。只需要让初始化进行一次就可以了:
解决办法
- 定义一个类属性
init_flag
标记是否 执行过初始化动作,初始值为False
- 在
__init__
方法中,判断init_flag
,如果为False
就执行初始化动作 - 然后将
init_flag
设置为True
- 这样,再次 自动 调用
__init__
方法时,初始化动作就不会被再次执行 了
异常:
异常的概念
- 程序在运行时,如果
Python 解释器
遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常 - 程序停止执行并且提示错误信息 这个动作,我们通常称之为:抛出(raise)异常
程序开发时,很难将 所有的特殊情况 都处理的面面俱到,通过 异常捕获 可以针对突发事件做集中的处理,从而保证程序的 稳定性和健壮性
捕获异常
简单的捕获异常语法
- 在程序开发中,如果 对某些代码的执行不能确定是否正确,可以增加
try(尝试)
来 捕获异常 - 捕获异常最简单的语法格式:
try:
尝试执行的代码
except:
出现错误的处理
try
尝试,下方编写要尝试代码,不确定是否能够正常执行的代码except
如果不是,下方编写尝试失败的代码
错误类型捕获
-
在程序执行时,可能会遇到 不同类型的异常,并且需要 针对不同类型的异常,做出不同的响应,这个时候,就需要捕获错误类型了
捕获未知错误
- 在开发时,要预判到所有可能出现的错误,还是有一定难度的
异常捕获完整语法
- 在实际开发中,为了能够处理复杂的异常情况,完整的异常语法如下:
try:
# 尝试执行的代码
pass
except 错误类型1:
# 针对错误类型1,对应的代码处理
pass
except 错误类型2:
# 针对错误类型2,对应的代码处理
pass
except (错误类型3, 错误类型4):
# 针对错误类型3 和 4,对应的代码处理
pass
except Exception as result:
# 打印错误信息
print(result)
else:
# 没有异常才会执行的代码
pass
finally:
# 无论是否有异常,都会执行的代码
print("无论是否有异常,都会执行的代码")
演示:
. 异常的传递
- 异常的传递 —— 当 函数/方法 执行 出现异常,会 将异常传递 给 函数/方法 的 调用一方
- 如果 传递到主程序,仍然 没有异常处理,程序才会被终止
提示
- 在开发中,可以在主函数中增加 异常捕获
- 而在主函数中调用的其他函数,只要出现异常,都会传递到主函数的 异常捕获 中
- 这样就不需要在代码中,增加大量的 异常捕获,能够保证代码的整洁
def demo1():
return int(input("请输入一个整数:"))
def demo2():
return demo1()
try:
print(demo2())
except ValueError:
print("请输入正确的整数")
except Exception as result:
print("未知错误 %s" % result)
抛出 raise
异常
应用场景
- 在开发中,除了 代码执行出错
Python
解释器会 抛出 异常之外 - 还可以根据 应用程序 特有的业务需求 主动抛出异常
示例
- 提示用户 输入密码,如果 长度少于 8,抛出 异常
抛出异常
Python
中提供了一个Exception
异常类- 在开发时,如果满足 特定业务需求时,希望 抛出异常,可以:
- 创建 一个
Exception
的 对象 - 使用
raise
关键字 抛出 异常对象
- 创建 一个
示例:
- 定义
input_password
函数,提示用户输入密码 - 如果用户输入长度 < 8,抛出异常
- 如果用户输入长度 >=8,返回输入的密码
def input_password():
# 1. 提示用户输入密码
pwd = input("请输入密码:")
# 2. 判断密码长度,如果长度 >= 8,返回用户输入的密码
if len(pwd) >= 8:
return pwd
# 3. 密码长度不够,需要抛出异常
# 1> 创建异常对象 - 使用异常的错误信息字符串作为参数
ex = Exception("密码长度不够")
# 2> 抛出异常对象
raise ex
try:
user_pwd = input_password()
print(user_pwd)
except Exception as result:
print("发现错误:%s" % result)