python核心编制之装饰器

python核心编制之装饰器

该文档仅用作学习笔记,转载请表明出处

装饰器

  • 装饰器是程序开发中经常会用到的一个功能,用好了装饰器,可以极大的提升开发效率。
    首先我们来看一段代码,案例v20:
def foo():
    print("foo")

print(foo)   #表示是函数
foo()   #表示调用foo函数



def foo():
    print('foo')


foo = lambda x: x + 1


print(foo(1))

输出结果为:
在这里插入图片描述

  • 在开发中,写代码要遵循开放封闭原则,虽然这个原则用的是面向对象开发,但是也适用于函数式编程,简单的说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:
    • 封闭:已经实现的功能代码块
    • 开放:对扩展开发
      案例21:
def w1(func):
    def inner():
        print('---正在调用权限---')
        func()
    return inner


def f1():
    print('-------f1-------')

innerFunc = w1(f1)
innerFunc()

输出的结果为:
在这里插入图片描述
这段代码的扩展性不强,我们用装饰器的方法来修改,案例22:

def w1(func):
    def inner():
        print('---正在调用权限---')
        func()
    return inner
    
@w1
def f1():
    print('-------f1-------')
@w1
def f2():
    print('-------f2-------')

f1()
f2()

输出结果为:
在这里插入图片描述

装饰器的执行时间

修改一下案例v22:

def w1(func):
    print('------123-----')
    def inner():
        print('---正在调用权限---')
        func()
    return inner

@w1  #此时就会自动的进行装饰,不是调用函数的时候才装饰
def f1():
    print('-------f1-------')

@w1
def f2():
    print('-------f2-------')


f1()
f2()

输出结果为:
在这里插入图片描述

装饰器对有参数,无参数函数进行装饰

案例23:无参数函数

def func(funcName):
    print("------func1------")
    def fun_in():
        print("------func_in1------")
        funcName()
        print("------func_in2------")

    print("------func2------")
    return fun_in

def test():
    print("------test------")

test = func(test)
test()

输出结果为:
在这里插入图片描述案例23:有参数函数

def func(funcName):
    print("------func1------")
    def fun_in(a,b):
        print("------func_in1------")
        funcName(a,b)
        print("------func_in2------")

    print("------func2------")
    return fun_in

@func    #等价于 test = func(test)
def test(a,b):
    print(a+b)

#test = func(test)
#执行步骤
#func(test)    funcName   --->  print(a+b)
#print('func1')   ---->   print(func2)   ---->   return(fun_in)
#test  ---->   fun_in:  ...
test(11,12)
#执行步骤
# test(11,12)   ---->   fun(11,12)   ---->print('func_in1')   ---->   funcName(11,12)
#funcName(11,12) = print(11+12)  ---->   打印23
#print('func_in2')

输出结果为:
在这里插入图片描述

装饰器对有带有返回值的函数进行装饰

案例v25:

def func(funcName):
    print("------func1------")
    def fun_in(a,b):
        print("------func_in1------")
        funcName(a,b)
        print("------func_in2------")
        return funcName(a,b)
    print("------func2------")
    return fun_in

@func    #等价于 test = func(test)
def test(a,b):
    return a+b
    
print(test(11,12))

输出结果为:
在这里插入图片描述

通用装饰器

案例v26:

def func(funcName):
    def fun_in(*args,**kwargs):
        ret = funcName(*args,**kwargs)
        return ret
    return fun_in

@func    #等价于 test = func(test)
def test():
    return 'haha'

@func
def test2():
    print("---test2----")

@func
def test3(a):
    print("----{}-----".format(a))


print(test())

test2()

test3(1)

输出结果为:
在这里插入图片描述

带有参数的装饰器

案例v27:装饰器带参数,在原有装饰器的基础上,设置外部变量

'''
装饰器带参数,在原有装饰器的基础上,设置外部变量
'''

from time import ctime,sleep

def timefun_arg(pre = 'hello'):
    def timefun(func):
        def wrappedfunc():
            print("%s called at %s %s"%(func.__name__,ctime(),pre))
            return func()
        return wrappedfunc
    return timefun

@timefun_arg("itcast")    #  调用timefun_arg("itcast")返回的是timefun函数,只不过里面的pre变量变成了‘itcast’
                          #  等价于@timefun
                          #  foo = timefun(foo)  func--->print('i am foo')
                          #                      返回 wrappedfunc   ---->      foo ---->wrappedfunc函数

def foo():
    print("i am foo")

@timefun_arg("python")
def too():
    print("i am too")

#foo ---->wrappedfunc函数
#运行wrappedfunc函数的语句块
#print("%s called at %s %s"%(func.__name__,ctime(),pre))   此时pre = 'itcast'
#return func()  虽然它返回的是个None  但是此时又执行了一边func()函数 这个函数是  "func--->print('i am foo')"  语句块
#所以打印一遍  i am foo
foo()
sleep(2)
too()

输出结果为:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值