Python装饰器详解:让代码如虎添翼

2 下载量 106 浏览量 更新于2024-08-29 收藏 90KB PDF 举报
Python装饰器简介 Python装饰器(decorator)是一种特殊类型的函数,它可以修改或扩展其他函数的行为,而不需要修改原来的函数代码。装饰器可以在不改变原函数的情况下,添加新的功能或修改原函数的行为。 初期及问题诞生 在一个公司中,有三个业务部门(A、B、C)和一个基础服务部门(S)。S部门提供了两个函数供其他部门调用,函数如下: def f1(): print('f1 called') def f2(): print('f2 called') 初期,其他部门可以直接调用这两个函数,直到S部门需要对函数调用进行权限验证。如果有权限,才能进行调用,否则调用失败。 方案集合 有两个方案可以解决这个问题: 1. 让调用方(ABC部门)在调用时,先主动进行权限验证。 2. S部门在对外提供的函数中,首先进行权限认证,然后再进行真正的函数操作。 然而,这两个方案都存在问题: 第一个方案的问题是,将本不该暴露给外层的权限认证暴露在使用方面前,同时如果有多个部门,每个部门每个人都要周知到,这样做不靠谱。 第二个方案的问题是,当S部门对外提供更多的需要进行权限验证方法时,每个函数都要调用权限验证,同样也实在费劲,不利于代码的维护性和扩展性。 装饰器引入 答案肯定是有的,不然真的是弱爆了。我们可以使用装饰器来解决这个问题。 def w1(func): def inner(): print('验证权限') func() return inner @w1 def f1(): print('f1 called') @w1 def f2(): print('f2 called') f1() f2() 输出结果为: …验证权限… f1 called …验证权限… f2 called 可以看到,在调用f1、f2函数时,成功进行了权限验证。这是因为我们使用了装饰器,通过定义一个闭包函数w1,在我们调用函数上通过关键词@w1,这样就对f1、f2函数完成了装饰。 装饰器原理 首先,查看我们的装饰器函数w1,该函数接收一个参数func,其实就是接收一个方法名,w1内部又定义一个函数inner,在inner函数中增加权限校验,并在验证完权限后调用传进来的参数func,同时w1的返回值为内部函数inner,其实就是一个闭包函数。 装饰器的优点是可以在不改变原函数的情况下,添加新的功能或修改原函数的行为。装饰器可以用于实现权限验证、日志记录、错误处理等功能。 装饰器是一种非常有用的功能,可以帮助我们编写更加灵活、可维护的代码。