Python随心记--装饰器

Posted

tags:

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

装饰器
本质就是函数,功能是为其他函数添加附加功能
原则是:不修改被修饰函数的源代码
不修改被修饰函数的调用方式
统计函数的运行时间 
import time
def cal(l):
    start_time = time.time()
    res = 0
    for i in l:
        time.sleep(0.1)
        res += i
    stop_time = time.time()
    print(函数的运行时间是%s秒 %(stop_time - start_time))
    return res
print(cal(range(10)))
加上装饰器方法 统计函数的运行时间
import time
def timmer(func):
    def wapper(*args,**kwargs):
        start_time = time.time()
        res = func(*args,**kwargs)
        stop_time = time.time()
        print(函数的运行时间是%s秒 %(stop_time - start_time))
        return res
    return wapper
@timmer
def cal(l):
    res = 0
    for i in l:
        time.sleep(0.1)
        res += i
    return res
print(cal(range(10)))
装饰器的知识储备
装饰器 = 高阶函数+函数嵌套+闭包
高阶函数
函数接收的参数是一个函数名
函数的返回值是一个函数名
满足上述任意条件一个都是高阶函数

def foo():
    print(你好啊林师傅)
def test(func):   #高阶函数
    print(func)
    func()
print(test(foo))

import time
def foo():
    print(你好啊林师傅)
def test(func):
    print(func)
    start_time = time.time()
    func()
    stop_time = time.time()
    print(函数的运行时间是%s秒 % (stop_time - start_time))
print(test(foo))
注:以上多运行了一次foo函数  

#高阶函数满足不了装饰器

import time
def foo():
    time.sleep(1)
    print(来自foo)
#不修改foo代码
#不修改foo调用方式
def timer(func):
    start_time = time.time()
    func()
    stop_time = time.time()
    print(函数的运行时间是%s秒 % (stop_time - start_time))
    return func
foo = timer(foo)
print(foo())

函数嵌套:函数里面定义一个函数
def father(name):
    print(from father %s %name)
    def son():
        print(from son)
        def grandson():
            print(from grandson)
        grandson()
    son()
father(大佬)
def father(name):
    print(from father %s %name)
    def son():
        print(from son)
    print(locals())
father(大佬)
函数嵌套及作用域
def father(name):
    def son():
        print(from son %s %name)
    son()
father(大佬)
def father(name):
    def son():
        name = 小豆芽
        print(from son %s %name)
    son()
father(大佬)

函数闭包装饰器基本实现
装饰器的框架
import time
def itmmer(func):
    def wrapper():
        strat_time = time.time()
        func()   #执行test函数
        stop_time = time.time()
        print(函数的运行时间是%s秒 % (stop_time - strat_time))
    return wrapper
def test():
    time.sleep(3)
    print(test函数运行完毕)
test = itmmer(test)#返回的是wrapper的地址
test()

 

#   @timmer  相当于 test = itmmer(test)  语法糖
import time
def itmmer(func):
    def wrapper():
        strat_time = time.time()
        func()   #执行test函数
        stop_time = time.time()
        print(函数的运行时间是%s秒 % (stop_time - strat_time))
    return wrapper
@itmmer
def test():
    time.sleep(3)
    print(test函数运行完毕)
test()
这里添加test返回值,,解决函数最后返回的None
import time
def itmmer(func):
    def wrapper():
        strat_time = time.time()
        res = func()   #执行test函数
        stop_time = time.time()
        print(函数的运行时间是%s秒 % (stop_time - strat_time))
        return res
    return wrapper
@itmmer
def test():
    time.sleep(1)
    print(test函数运行完毕)
    return 这里添加test返回值,,解决函数最后返回的None
res = test()   #这里会最后会返回一个None
print(res)

带参数
import time
def itmmer(func):
    def wrapper(name,age):
        strat_time = time.time()
        res = func(name,age)   #执行test函数
        stop_time = time.time()
        print(函数的运行时间是%s秒 % (stop_time - strat_time))
        return res
    return wrapper
@itmmer
def test(name,age):
    time.sleep(1)
    print(test函数运行完毕,名字是%s,年龄是%s %(name,age))
    return 这里添加test返回值,,解决函数最后返回的None
test(ss,20)
带参数 修改为可变参数
import time
def itmmer(func):
    def wrapper(*args,**kwargs):
        strat_time = time.time()
        res = func(*args,**kwargs)   #执行test函数
        stop_time = time.time()
        print(函数的运行时间是%s秒 % (stop_time - strat_time))
        return res
    return wrapper
@itmmer
def test(name,age):
    time.sleep(1)
    print(test函数运行完毕,名字是【%s】,年龄是【%s】 %(name,age))
    return 这里添加test返回值,,解决函数最后返回的None
test(ss,20)
可变参数 *args,**kwargs 传参实例
def test2(name,age,gender):
    print(name)
    print(age)
    print(gender)
def test1(*args,**kwargs):
    test2(*args,**kwargs)   #test2(*(‘alex‘,18,‘male‘,‘x‘,‘y‘),**{})



















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

Python装饰器

python 装饰器:装饰器实例类装饰器(装饰函数)

python 装饰器:装饰器实例类装饰器(装饰函数)

python 装饰器:装饰器实例内置装饰器

python 装饰器:装饰器实例内置装饰器

Python 装饰器和装饰器模式有啥区别?