当前位置: 首页 > 后端技术 > Python

使用装饰器装饰类方法,在装饰器中调用类方法

时间:2023-03-26 18:41:28 Python

类外的装饰器方法装饰类方法,并调用类的其他方法场景:链接数据库的类,执行数据库时操作,经常掉线。这时需要调用该类的连接数据库方法重新连接数据库classMy_dbclient():def__init__(self):self.try_count=10self.connect()defconnect(self):print("数据库链接成功")definsert(self):#可能会出现数据库链接断开的异常print("正在执行保存操作")foriinrange(self.try_count):try:print("保存data")#raiseNameErrorreturnexceptException:time.sleep(1)self.connect()print(traceback.format_exc())defselect(self):#可能出现数据库断开连接的异常print("querydata")defdelete(self):#可能会出现数据库断开连接的异常print("deletedata")和insert方法中一样,可以捕获异常,重新链接,然后进行操作。但是无论增删改查,都需要这样写,代码冗余。自然是用装饰器来解决。示例:常规装饰器编写defcatch_error(fun):defwrapper(*args,**kwargs):foriinrange(1,10):try:fun(*args,**kwargs)returnexceptException:time.sleep(1)print("Linkerror---{}---times".format(i))print("调用数据库链接方法,重新链接数据库")print("保存信息失败")returnwrapper@catch_errordefinsert():print("Startexecutingtheinsertstatement")raiseTimeoutError现在我们要修饰类方法,捕获数据库链接异常后,调用数据库链接方法重新链接。解决方法:在装饰器内部函数包装器的参数中添加self参数,在被调用函数fun中添加self参数如下,即可使用self调用connect方法。同时defcatch_error(fun):defwrapper(self,*args,**kwargs):foriinrange(1,10):try:fun(self,*args,**kwargs)returnexceptException:time.sleep(1)print("Linkerror---{}---times".format(i))print("调用数据库连接方法,重新连接数据库")self.connect()print("Failedtosaveinformation")returnwrapper完整代码:importtimeimporttracebackdefcatch_error(fun):defwrapper(self,*args,**kwargs):foriinrange(1,10):try:fun(*args,**kwargs)returnexceptException:time.sleep(1)print("Linkerror---{}---time".format(i))print("调用数据库链接方法,重新链接数据库")self.connect()print("保存信息失败")returnwrapper@catch_errordefinsert():print("开始执行插入语句")raiseTimeoutErrorclassMy_dbclient():def__init__(self):self.try_count=10self.connect()defconnect(self):print("数据库连接成功")@catch_errordefinsert(self):#MaybedisconnecteddatabaseLinkedexception打印("Savedata")raiseTimeoutErrordefselect(self):#可能有数据库断开异常print("查询数据")defdelete(self):#可能有数据库断开链接异常print("删除数据")if__name__=='__main__':t=My_dbclient()t.insert()