python装饰器理解实例

什么是装饰器:
是一个修饰函数把原函数包裹在装饰函数中,并且改变原函数的行为但原函数本身不变。(可类比生活中同一个人要拍结婚照了需要多套衣服,每套衣服是变的,都需要重用参与者肉身并不能改变肉身,那么就通过衣服把肉身包裹起来,然后完成各组拍照。衣服就是装饰,怎么实现换衣服并完成拍照就是装饰器的作用)
函数装饰器实例

import functools
def decorator(func):                 # 函数作为参数传入
    @functools.wraps(func)           # 解决原函数被替换为test函数问题
    def test(*args,**kwargs):        #*args,**kwargs 不知道传入的参数类型和数量,定义一个泛型
        print '-----------------------'     #在源函数前添加装饰操作
        func(*args,**kwargs)           #在修饰函数中调用原函数
        print '======================='     #在源函数后添加装饰操作
    return test         #闭包

@decorator                                #装饰器调用语法糖
def testfunc(param,param1):       #原函数
    print "base func : " + param +" : "+ param1


testfunc('hahaha','22222222222')
print testfunc.__name__            #输出原函数的名字testfunc

执行结果

-----------------------
base func : hahaha : 22222222222
=======================
testfunc

类装饰器实例

class test:
    def __init__(self,func):
        self.func = func
        self.num_calls =0
        print '1111111111111111111111'
    def __call__(self, *args, **kwargs):
        print ">>>>>>>>>>111"
        self.num_calls +=1
        print ('num is :' + str(self.num_calls))
        return self.func(*args,**kwargs)

class test2:
    def __init__(self,func):
        self.func = func
        self.num_calls =0
        print '2222222222222222222'
    def __call__(self, *args, **kwargs):
        print '=============222222222222222'
        self.num_calls +=10
        print ('num is :' + str(self.num_calls))
        return self.func(*args,**kwargs)
@test
@test2
def example():
    print "aaaaaaaaaaaa"
example()

调用结果:

2222222222222222222
1111111111111111111111
>>>>>>>>>>111
num is :1
=============222222222222222
num is :10
aaaaaaaaaaaa

理解基础:
1 函数是对象,函数可以赋值给变量
2 函数可以作为参数传入另一个函数中
3 函数嵌套,函数中定义函数
4 闭包,return 返回值是函数对象
5 @语法糖
6 实用场景:1 认证 2 日志处理 3数据校验 4单元测试时初始化和清理数据 5 并发、控制计数 等等来重用代码但是不去改动重用块的本身

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章