什么是python装饰器?

1.装饰器

在有两个重名的函数中,Python解释器会调用最后定义的那重名函数,因为在Python里,第一个函数指向的是一片内存,然后又让这个函数指向另一片内存,就会利用第二片内存来执行,所有函数名应尽量避免相同

写代码要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:

  • 封闭:已实现的功能代码块
  • 开放:对扩展开发
  • 实例:
def w1(func):
    def inner():
        # 验证1
        # 验证2
        # 验证3
        func()
    return inner
 
@w1 # 装饰器
def f1():
    print('f1')
 
@w1  # 装饰器
def f2():
    print('f2')

对于上述代码,也是仅仅对基础平台的代码进行修改,就可以实现在其他人调用函数 f1、 f2 、f3 、f4 之前都进行【验证】操作,并且其他业务部门无需做任何操作

2.装饰器的功能

  • 引入日志
  • 函数执行时间统计
  • 执行函数前预备处理
  • 执行函数后清理功能
  • 权限校验等场景
  • 缓存
  • 如果是有多个装饰器的情况,一般是先装饰最下面的一个,然后依次往上,@w1类比于f1 = w1(f1)

3.装饰有参数的函数

在传递参数的时候,需要在闭包里面定义一个形参,闭包里面的调用的函数也要定义一个形参,否则会导致两部分函数调用失败

4.装饰不定长的参数的函数

在传递参数的时候,需要在闭包里面定义一个*args**kwargs,闭包里面的调用的函数也要定义一个*args**kwargs,这样就可以在调用的时候传递任意长度的参数,增加代码的可复用性

5.装饰带返回值的函数

需要在闭包里面进行一个接收,也就是ret = test(),然后再把接收到的ret return出去,这样在装饰的test才能返回出当前需要返回的东西,否则只会返回None

6.通用的装饰

def w1(func):
    print("-----正在装饰-----")
    def inner(*args,**kwargs):
        print("---正在验证权限---")
        print("----记录日志----")
        ret = func(*args,**kwargs)
        return ret
    return inner

带有参数的装饰器:也就是在原来包含一个闭包的函数外面再给他套一个函数,用来传递装饰器的参数

def func_arg(arg):
    def w1(func):
        print("---记录日志---")
        def inner(*args,**kwargs):
            func(*args,**kwargs)
        return inner
    return w1
 
@func_arg("heihei")
def f1():
    print("----f1----")              
 
# 1.先执行func_arg("heihei")函数,这个函数return的结果是
# 2.@w1
# 3.使用@w1对f1进行装饰
# 作用:带有参数的装饰器,能够起到在运行时,有不同的功能

猜你喜欢

转载自blog.csdn.net/Python_222/article/details/129955227