单例设计模式
概念:使所有 一个类创建的对象都只有一个实例(也就是说这些对象的地址相同)
__new __ 方法
作用
- 在内存中为对象分配空间
- 返回 对象的引用
注意:__new __ 一定要返回对象的引用return super().__new __(cls)
与 __init __ 的区别
- __new __ 分配空间
- __init __ 对象初始化
创建思想:
就像创建不带头结点的单链表,初始变量为空,如果是第一次添加(instance is None),则给创建一个新的对象;否则不执行任何操作。
另外,由于 __init __ 函数每次都要执行,可以增加一个类属性flag,控制执行次数。
class A(object):
instance = None
init_flag = False
# new 是静态方法,即使没有加上静态方法的修饰器
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls) # 如果为空,则新创建一个对象
return cls.instance
def __init__(self): # 使初始化方法只执行一次
if A.init_flag:
return
# do some thing
A.init_flag = True
aa = A()
bb = A()
print(id(aa))
print(id(bb)) # 二者地址相同
print(id(A)) # 类对象的地址与上面不同,因为上面创建的是实例对象
异常处理机制
一个简单的版本:
try: # 尝试错误
pass
except: # 抛出异常
pass
更完整的版本:
try:
pass
except 错误类型1:
pass
except (错误类型2, 错误类型3, 错误类型4):
pass
except Exception as result:
print("未知错误:%s" % result)
else: # 没有错误才会执行的代码
pass
finally: # 无论是否有异常,都会执行的代码
pass
解释器抛出的错误类型为报错行的第一个单词,ex.:
RecursionError: maximum recursion depth exceeded
则错误类型为:RecursionError
技巧:可以利用异常的传递性,只在调用该函数的地方(例如主函数)做异常处理,这样就可以不用在每个函数中都做异常处理。
主动抛出异常(raise)
尝试 try ——抛出 raise——捕获 except
1.创建一个Exception类的对象
2.使用关键字raise 关键字 抛出 异常对象
使用:
def input_password():
password = input("请输入密码:")
if len(password) >= 8:
return password
ex = Exception("密码长度不够") # 创建Exception对象,引号内字符串为提示信息
raise ex # 抛出异常
try:
print(input_password())
except Exception as result:
print(result)