Python-单例,异常

1.8. 单例、异常

1.__new__()方法

  • __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
  • __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__方法的时候要特别注意,可以return父类的__new__出来的实例,或者直接是object的__new__出来的实例
  • __init__有一个参数self,就是这个__new__返回的实例,__init____new__的基础上可以完成一些其他初始化的动作,__init__不需要返回值
  • 我们可以将类比作制造商,new方法就是前期的原材料购买环节,init方法就是在有原材料的基础上,加工,初始化商品环节

__new__没有返回值的情况,只是相当于商品购买原材料的环节

class Dog(object):
    def __init__(self):
        print("__init__")
    def __del__(self):
        print("__del__")
    def __new__(cls, *args, **kwargs):
        print("__new__")
dog=Dog()

结果是:__new__

__new__有返回值的情况

class Dog(object):
    def __init__(self):
        print("__init__")
    def __del__(self):
        print("__del__")
    def __new__(cls, *args, **kwargs):
        print("__new__")
        return object.__new__(cls)
dog=Dog()

结果是:

__new__
__init__
__del__

2.单例

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

__new____init都执行一次:

class Dog(object):
    __instance=None
    __first_init=None

    def __init__(self,name):
        if not self.__first_init:
            self.name=name
            Dog.__first_init=True
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance=(object).__new__(cls)
        return cls.__instance

dog1=Dog("aaa")
print(dog1.name)
print(id(dog1))

dog2=Dog("nnn")
print(dog2.name)
print(id(dog2))

结果是:

aaa
139651010014176
aaa
139651010014176

3.异常

1.)捕获异常

用try…except…

try:
    print(num)
    open("xxxx.txt")
except (NameError,FileNotFoundError):
    print("捕获到异常,进行处理")
except Exception as ret:
    print("如果用了Exception,那么意味着只要上面的except没有捕获到异常,这个except一定会捕获到")
else:
    print("没有异常才会执行的功能")
finally:
    print("必须要执行的")

2.)自定义异常

raise:用于抛出异常

class MyExecption(Exception):
    def __init__(self,msg):
        self.msg=msg

def main():
    try:
        raise MyExecption("自定义异常")
    except MyExecption as result:
        print('MyExecption:',result.msg)
    else:
        print("没有异常")
main()

结果是:MyExecption: 自定义异常

抛出异常:

class Test(object):
    def __init__(self, switch):
        self.switch = switch #开关
    def calc(self, a, b):
        try:
            return a/b
        except Exception as result:
            if self.switch:
                print("捕获开启,已经捕获到了异常,信息如下:")
                print(result)
            else:
                #重新抛出这个异常,此时就不会被这个异常处理给捕获到,从而触发默认的异常处理
                raise


a = Test(True)
a.calc(11,0)

print("----------------------华丽的分割线----------------")

a.switch = False
a.calc(11,0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值