01. 装饰器实现过程
def set_func(func):
def call_func():
print("---这是权限验证1----")
print("---这是权限验证2----")
func()
return call_func
@set_func # 等价于test1 = set_func(test1)
def test1():
print("-----test1----")
# ret = set_func(test1)
# ret()
# test1 = set_func(test1)
test1()
test1()
02. 装饰器的作用-来统计一个函数的运行时间
import time
def set_func(func):
def call_func():
start_time = time.time()
func()
stop_time = time.time()
print("alltimeis %f" % (stop_time - start_time))
return call_func
@set_func # 等价于test1 = set_func(test1)
def test1():
print("-----test1----")
for i in range(10000):
pass
# ret = set_func(test1)
# ret()
# test1 = set_func(test1)
test1()
test1()
03. 对有参数、无返回值的函数进行装饰
def set_func(func):
def call_func(a):
print("---这是权限验证1----")
print("---这是权限验证2----")
func(a)
return call_func
@set_func # 相当于 test1 = set_func(test1)
def test1(num):
print("-----test1----%d" % num)
test1(100)
test1(200)
# xx = set_func(test1)
04. 装饰器在没有调用函数之前已经装饰了
def set_func(func):
print("---开始进行装饰")
def call_func(a):
print("---这是权限验证1----")
print("---这是权限验证2----")
func(a)
return call_func
@set_func # 相当于 test1 = set_func(test1)
def test1(num):
print("-----test1----%d" % num)
@set_func # 相当于 test2 = set_func(test2)
def test2(num):
print("-----test2----%d" % num)
# 装饰器在调用函数之前,已经被python解释器执行了,所以要牢记 当调用函数之前 其实已经装饰好了,尽管调用就可以了
# test1(100)
# test2(200)
05. 对不定长参数的函数进行装饰
def set_func(func):
print("---开始进行装饰")
def call_func(*args, **kwargs):
print("---这是权限验证1----")
print("---这是权限验证2----")
# func(args, kwargs) # 不行,相当于传递了2个参数 :1个元组,1个字典
func(*args, **kwargs) # 拆包
return call_func
@set_func # 相当于 test1 = set_func(test1)
def test1(num, *args, **kwargs):
print("-----test1----%d" % num)
print("-----test1----", args)
print("-----test1----", kwargs)
test1(100)
test1(100, 200)
test1(100, 200, 300, mm=100)
06. 对带有返回值的函数进行装饰
def set_func(func):
print("---开始进行装饰")
def call_func(*args, **kwargs):
print("---这是权限验证1----")
print("---这是权限验证2----")
# func(args, kwargs) # 不行,相当于传递了2个参数 :1个元组,1个字典
return func(*args, **kwargs) # 拆包
return call_func
@set_func # 相当于 test1 = set_func(test1)
def test1(num, *args, **kwargs):
print("-----test1----%d" % num)
print("-----test1----" , args)
print("-----test1----" , kwargs)
return "ok"
@set_func
def test2():
pass
ret = test1(100)
print(ret)
ret = test2()
print(ret)
07. 多个装饰器对同一个函数进行装饰
def set_func_1(func):
def call_func():
# "<h1>haha</h1>"
return "<h1>" + func() + "</h1>"
return call_func
def set_func_2(func):
def call_func():
return "<td>" + func() + "</td>"
return call_func
@set_func_1
@set_func_2
def get_str():
return "haha"
print(get_str())
08. 使用类当做装饰器
# def set_func_1(func):
# def call_func():
# # "<h1>haha</h1>"
# return "<h1>" + func() + "</h1>"
# return call_func
class Test(object):
def __init__(self, func):
self.func = func
def __call__(self):
print("这里是装饰器添加的功能.....")
return self.func()
@Test # 相当于get_str = Test(get_str)
def get_str():
return "haha"
print(get_str())
09. 修改闭包中的数据
x = 300
def test1():
x = 200
def test2():
nonlocal x # 当使用 nonlocal 时,就声明了该变量不只在嵌套函数inner()里面才有效, 而是在整个大函数里面都有效。
print("----1----x=%d" % x)
x = 100
print("----2----x=%d" % x)
return test2
t1 = test1()
t1()