python--装饰器

首先,什么是装饰器呢?

装饰器,在原有函数的基础上增加新功能,并且保证原有函数的源代码不改变、调用方式不改变。

举个例子:以下面函数为例,是原有的函数,功能仅为print(“This is an example!”)

def origin():
        print("This is an example!")

现在目标是,加上新功能print(“a new func!!!”),怎样通过装饰器来加上这个功能呢?首先完成以下进阶:
1.内存机制:

def test():
print(“Test”)
return(test)

test()
Test

p=test()
Test
p()
Test

看到了p是一个和test一样的函数,怎样做到这点的呢,将存有test函数内容的地址给了p,再通过p这个门牌号,调用了这个地址空间的功能。
所以,实现功能重要的是这个地址,门牌号不重要,只是个手段。
2.高阶函数
高阶函数:把一个函数名当做实参传给另一个函数;返回值中包含函数名
由上一小节已经知道了函数和变量一样,都可以通过一个地址来调用,现在就来看看怎样实现高阶函数。
记得我们要实现的新功能吗,现在就用高阶函数的方法来试试整合新旧功能吧:

def append(func):
    func()
    print("a new func!!!")

这个函数实现了新功能print(“a new function!!!“)”,看到func了吗,通过将test函数当做变量传给append就能实现这个附加功能了,现在调用下:

>>> append(origin)
this is an example
a new func!!!

这离我们的装饰器还差点,调用方法还需要再想想办法改进。
记得我们第一节的方法吗,如果将append函数的地址交给origin名片呢?origin实现的功能就是修改后的append的功能了。怎样做呢?怎样将append函数的地址交给origin?想一想变量是怎样做的吧?
3.嵌套函数:
利用嵌套函数将append的函数的地址返回:

>>> def method(func):
    def append():
        func()
        print("a new func!!!")
    return append

现在,想好怎样调用这个函数了吗?

>>> origin=method(origin)
>>> origin()
This is an example!
a new func!!!

至此,origin已经成为一个有新功能的函数了。
4.装饰器
(1)基础篇
上个例子完整代码:
`def method(func):
def append():
func()
print(“a new func!!!”)
return append

@method #相当于origin=method(origin)
def origin():
print(“This is an examplel!”)
(2)函数有传参情况
上面的例子是一个无参数的函数附加功能的实现,看下面

def method(func):
def append():
func()
print(“a new func!!!”)
return append

mark=”CADN”
@method
def origin(mark):
print(“This is an examplel!”,mark)

origin()`
上面代码能实现吗?
借助不限量传参:*args,**kwargs,如下

def method(func):
    def append(*args,**kwargs):#append就是和目标函数,兼具origin和附加功能
        func(*args,**kwargs)       #这个相当于origin
        print("a new func!!!")
    return append


@method
def origin(mark):
    print("This is an examplel!",mark)

origin("CSDN")

(3)函数有返回值情况

def method(func):
    def append(*args,**kwargs):        
        func(*args,**kwargs)               
        print("a new func!!!")
    return append
@method
def origin():
    print("This is an example!")
    return "my name is huahua"
print(origin())

结果:
This is an example!
a new func!!!
None
这改变了我的origin功能,怎么办呢,继续改method,改哪呢?
其实,装饰器函数中的func就是origin函数,执行完func返回值自然就是我们想要的,so,从func下手!
完整代码如下:

def method(func):
    def append():
        p=func()
        print("a new func!!!")
        return p
    return append

@method
def origin():
    print("This is an example!")
    return "my name is huahua"
print(origin())

综上,事实上,修改后的origin执行的代码是append中的,而append中包含了func(即origin)和附加功能。

猜你喜欢

转载自blog.csdn.net/weixin_41338006/article/details/79201297
今日推荐