装饰器

Posted 浅笑微凉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

一,为什么要使用装饰器

装饰器是为了给某些函数添加一些通用功能,却不用去改变函数的源代码,例如给网页添加登录验证的功能。

装饰器 = 高阶函数 + 函数嵌套 + 闭包

 

二,高阶函数

1.函数接收的参数是一个函数名
2.函数的返回值是一个函数名
3.满足上述条件任意一个,都可称之为高阶函数

例如:

def foo
    print(hello, python)

def test(func):
      print(func)
      start_time=time.time()
      func()
      stop_time = time.time()
      print(函数运行时间是  %s % (stop_time-start_time))

test(foo)

 

三,函数嵌套

函数嵌套: 函数里面定义新的函数

例如:

def father(name):
def son(): print(我的爸爸是%s %name) def grandson(): print(我的爷爷是%s %auth_type) grandson() son()
file

 

四,闭包

闭包: 闭包的意思就是在子函数里面定义一个变量使得父函数的变量不影响子函数的变量。

例如:

def father(name):
    print(from father %s %name)
    def son():
        name=‘linhaifeng‘
        print(‘我的爸爸是%s‘ %name)
        def grandson():
            print(我的爷爷是%s %auth_type)
        grandson()
    son()
father(linlei)

 

五,装饰器的实现

import time
def timmer(func): #func=test
    def wrapper():
        start_time=time.time()
        func() #就是在运行test()
        stop_time = time.time()
        print(运行时间是%s %(stop_time-start_time))
    return wrapper

@timmer #test=timmer(test)
def test():
    time.sleep(3)
    print(test函数运行完毕)

test()

# test=timmer(test)  #返回的是wrapper的地址
# test()  #执行的是wrapper()
#  @timmer  就相当于 test=timmer(test)

 

六,带返回值的函数的装饰器

#__author: Administrator
#__date: 2018/4/4/004
import time
def timmer(func):
    def wrapper():
        start_time=time.time()
        res=func()
        stop_time=time.time()
        print(运行时间是:%s%(stop_time-start_time))
        return res
    return wrapper
@timmer#test=timmer(test)
def test():
    time.sleep(3)
    print(函数运行完毕)
    return 这是函数的返回值

res=test()
print(res)

 

七,带参数函数的实现

import time
def timmer(func): #func=test1
    def wrapper(*args,**kwargs): #test(‘linbi‘,age=18)  args=(‘linhaifeng‘)  kwargs={‘age‘:18}
        start_time=time.time()
        res=func(*args,**kwargs) #就是在运行test()         func(*(‘linbi‘),**{‘age‘:18})
        stop_time = time.time()
        print(运行时间是%s %(stop_time-start_time))
        return res
    return wrapper

# @timmer #test=timmer(test)
def test(name,age):
    time.sleep(3)
    print(test函数运行完毕,名字是【%s】 年龄是【%s】 %(name,age))
    return 这是test的返回值

@timmer
def test1(name,age,gender):
    time.sleep(1)
    print(test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】 %(name,age,gender))
    return 这是test的返回值

res=test(linbi,age=18)  #就是在运行wrapper
print(res)

test1(‘liming,18,male)

 

以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

thymeleaf 片段渲染后重新加载 javascript

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码