单例
__new__()方法:
__new__()
方法是由object
基类提供的内置方法,主要用来创建单例类;- 对象创建时
__new__()
方法首先为对象分配一个内存空间(如果类中没有显式定义__new__()
方法,则类中的__new__()
方法继承自object基类); - 然后
__new__()
方法返回对象的引用,__init__()
方法接收到返回的对象引用后才会开始初始化工作; __new__()
方法重写时一定要在继承object
基类的__new__()
方法的基础上进行扩展,即重写的__new__()
方法模块需要包含return super().__init__(cls)
语句;- 创建单例类代码示例:
class XXX(object):
instance = None
def __new__(cls):
if cls.instance is Mone:
cls.instance = super().__new__(cls)
return cls.instance
- 只执行一次初始化方法示例:
class DanLi(object):
instance = None
init_flg = False
def __new__(cls):
if cls.instance is None:
cls.instance = super().__new__(cls) #__new__()方法是静态方法
return cls.instance
def __init__(self):
# 只执行一次初始化方法
if DanLi.init_flg:
return
print('Initializing...')
DanLi.init_flg = True
单例类
单例类:无论类创建多少对象,这些对象只是一个实例,即多次创建的对象其内存地址相同。创建单例类采用__new__()
方法。
异常
异常处理
- 简单错误处理:
try:
需要执行的代码
except:
try中代码出错后执行,未出错不执行
- 根据不同错误类型处理:
try:
pass
except errotypr1:
pass
except (errotype2, errotype3):
pass
except Exception as result: # 捕获1,2,3没捕获的错误
print(result)
else:
没有异常会执行该区块代码
finally:
无论是否有异常都会执行该区块代码
异常传递
当异常发生时,异常会层层传递,最终传递到最后一层。因此,在编写异常捕获和处理时,可针对最后一层进行处理,不需要所可能存在异常的地方都进行处理。从而将注意力放在代码逻辑的开发上,而不是将注意力分散在异常处理上。
def demo1():
return int(input("输入一个整数: "))
def demo2():
return demo1()
# 在主程序中进行异常处理,demo1()和demo2()函数中不进行异常处理
try:
print(demo2())
except Exception as result:
print("异常类型: %s" % result)
定制异常提示
- 创建一个
Exception
异常对象 - 使用
raise
关键字抛出异常对象
示例:
# 输入长度至少为8位的密码,少于8位,抛出异常
def input_pwd():
pwd = input('Input a password: ')
if len(pwd) >= 8:
return pwd
else:
ex = Exception('The length of password must longer than 8 digits...')
raise ex
# 在主程序中捕获处理自定义异常
try:
input_pwd()
except Exception as result:
print(result)