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)