python 装饰器

装饰器是闭包的一种使用场景;

python中的装饰器在定义上需要传入一个函数对象,
在此函数执行之前或者之后都可以追加其它的操作,
这样做的好处是,在不改变源码(原本业务逻辑的)同时,进行功能的扩展;
它在python中一般被使用在,性能测试,插入日志,事务管理,权限校验...
它就好比是一个切面(可插拔的),也就是我们之后学习中会提到的叫面向切面编程(aop)

开放封闭原则:

开放:
    在不改动源码(破坏原本业务逻辑)的同时扩展新的功能

封闭:
    不允许随意去修改源代码

import time
'''
说明装饰器的好处:

部门A:维护和管理数据信息平台

信息平台:内部封装了一些核心的api和接口

装饰器:函数(fn)

部门B:
    m1():
    func1()
    func2()
    func3()

部门C:
    func4()
    func5()
    func6()
...

'''

def outer(fn):
    def inner():
        print('功能开始前记录日志...')
        # start = time.time()
        fn()
        print('功能介绍了记录日志...')
        # end = time.time()
        # print(end - start)
    return inner

@outer
def test():
    print('我是test函数...')

# i = outer(test)
# i()

test()

'''
演示函数装饰器的几种常见的定义格式:
'''

#无参无返回值的装饰器
def outer(fn):
    def inner():
        print('功能开始前记录日志...')
        # start = time.time()
        fn()
        print('功能介绍了记录日志...')
        # end = time.time()
        # print(end - start)
    return inner

@outer
def test():
    print('我是test函数...')

test()

#无参有返回值的装饰器
def make_bold(fn):
    def wrapper():
        return "<b>" + fn() + "</b>"
    return wrapper

def make_italic(fn):
    def wrapper():
        return "<i>" + fn() + "</i>"
    return wrapper

@make_bold
@make_italic
def test():
    return "hello zsq"

print(test())

#有参有返回值的装饰器
def zhuangshiqi(fn):
    def wrapper(name,age,sex):
        print(name,age)
        fn(name,age,sex)
        print(sex)
        return "abcdefg"
    return wrapper

@zhuangshiqi
def test(n,a,s):
    print('我叫:%s,年龄为:%s,性别是:%s' %(n,a,s))

res = test(name="老郭",sex="男",age=18)
print(res)

#通用装饰器
def zsq(fn):
    def wrapper(*args,**kwargs):
        print(args)
        fn(*args,**kwargs)
        print(kwargs)
        return '装饰器不难学'
    return wrapper

@zsq
def test(name,age,hobby):
    print('我叫:%s,年龄为:%s,爱好是:%s' %(name,age,hobby))

print(test(age=30,name='班长',hobby={'游戏':'魔兽','女性':'御姐','体育':'篮球'}))














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值