python修饰器学习

python 专栏收录该内容
7 篇文章 0 订阅

python修饰器

什么是修饰器?

修饰器是一个函数,接收的唯一参数也是一个函数或方法,返回一个再输入函数基础上加以修饰的新的函数或方法(就能附带一些额外的功能)

了解一个简单的栗子

以下就是用代码实现修饰器的功能

def wrapper_func(func):#修饰函数,传入参数为一个函数
    def wrapper():
        print("我是一个修饰")	#修饰
        func()#调用函数
        print("我也是一个修饰")	#修饰
    return wrapper

def hello():#待传入的函数
    print("我是hello函数!")
    
test = wrapper_func(hello)#修饰后的结果
test()

输出结果:

我是一个修饰
我是hello函数!
我也是一个修饰

上述代码加上语法糖,代码可以更加简洁:

def wrapper_func(func):#修饰函数,传入参数为一个函数
    def wrapper():
        print("我是一个修饰")#修饰
        func()#调用函数
        print("我也是一个修饰")#修饰
    return wrapper

@wrapper_func	#修饰器
def hello():#待传入的函数
    print("我是hello函数!")
hello()

输出结果同上

修饰器的执行顺序

一个有趣的“汉堡”

def bread(func) :  
    def wrapper() :  
        print("</'''       '''\>")
        func()  
        print("<\______/>")
    return wrapper  
   
def ingredients(func) :  
    def wrapper() :  
        print("#tomatoes#")
        func()  
        print("~salad~")
    return wrapper  

@bread
@ingredients	#等价于bread(ingredients(sandwich))
def sandwich(food="--ham--") :  
    print(food)
sandwich()

输出结果:

</'''       '''\>
#tomatoes#
--ham--
~salad~
<\______/>

万能的修饰器

def w_test(func):
    def inner(*args, **kwargs):
        ret = func(*args, **kwargs)
        return ret

    return inner


@w_test
def test():
    print('test called')


@w_test
def test1():
    print('test1 called')
    return 'python'


@w_test
def test2(a):
    print('test2 called and value is %d ' % a)

test()
test1()
test2(9)

输出结果:

test called
test1 called
test2 called and value is 9 

修饰器的一些用途

装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

比如用于计算函数运行实践的修饰器:

import time  
def timeit(func):  
    def wrapper():  
        start = time.clock()  
        func()  
        end =time.clock()  
        print 'Time Elapsed:', end - start  
    return wrapper
展开阅读全文
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值