Python学习总结(六)单例设计模式与异常处理

单例设计模式

概念:使所有 一个类创建的对象都只有一个实例(也就是说这些对象的地址相同)

__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 错误类型1pass

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值