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()
输出结果为: