【重点】【装饰器看这篇一】装饰器的原理【杭州多测师】【多测师_王sir】

 

装饰器原理:自己写一个装饰器相当于函数里面还有一个函数,然后内部函数返回的是函数的调用,给到外部函数,使用装饰器的函数,会把整个函数当做是装饰器的入参传入到装饰器里面去进行处理,只要你被装饰、那么就相当于这个被装饰的函数的函数名=装饰器(被装饰的函数名)
装饰器的作用:在不改变原有函数功能的基础之上、给函数增加新的功能
装饰器原理其他解释:【重点】【装饰器看这篇二】装饰器和ddt装饰器在ui自动化中的应用【杭州多测师】【多测师_王sir】

#第一种情况:装饰器return
def modify(func):
    def injob():
        print('正在进行扩展功能')
        return func()
    return injob

@modify
def func():
    print('func 正在执行')
    return "result"

print(func())
# 正在进行扩展功能
# func 正在执行
# result

#第二种情况:装饰器不return
def modify(func):
    def injob():
        print('正在进行扩展功能')
        func()
    return injob

@modify
def func():
    print('func 正在执行')
    return "result"

print(func())
# 正在进行扩展功能
# func 正在执行
# None


#第三种情况:没有装饰器不
def modify(func):
    def injob():
        print('正在进行扩展功能')
        func()
    return injob

def func():
    print('func 正在执行')
    return "result"

print(func())
# func 正在执行
# result

 

上面三段代码分别是未经过装饰器扩展时目标函数的执行结果,然后是加了装饰器,但是没有返回函数结果和返回了函数结果的三种情况。
我们知道,装饰器的作用就是给目标函数扩展功能,基本原则是不能影响原函数的功能,所以不加return的话,原函数的基本功能都受到影响了,必须对原函数的返回值进行再次return。

现在我们来说结论,函数名是指代的函数代码所在的空间,函数名加括号,指代的是函数往外传递的数据,而return就是往外传递数据的工具,如果函数名()没有接收到return出来的数据,那么“函数名()”除了执行命令外,什么也不是,函数往外传递的数据就丢失了。

装饰器的核心在于闭包的内层函数,外层函数将目标函数拿来加工,用内层函数包裹目标函数的代码,然后将这一整块代码返回给目标函数的函数名,现在目标函数的函数名(代号func)指向的是加工过的函数代码,原来的代码成了外来户,所以原来代码传递的数据如果没有中间人进行传递的话,func将不能接收那个数据,那个数据就丢失了。func()原来可以容放原函数返回值,现在就什么都没有了。所以,return是很有必要的。

 

posted @ 2024-01-18 11:49  多测师_王sir  阅读(70)  评论(0编辑  收藏  举报