Python----多个装饰器装饰一个函数

#装饰器回顾:

# def wrapper(f): #f= func1
# def inner(*args,**kwargs):
# print(333) #1. 333
# ret=f(*args,**kwargs)
# print(666)
# return ret
# return inner
# @wrapper # func1=wrapper(func1)=inner
# def func1(): # inner() 定义函数,将函数加载到内存中,但是不执行,等待被调用
# print(111) #2. 111
# func1() #inner()
# @wrapper
# def func2(a,b):
# print(a,b)
# func2(1,2)
# @wrapper
# def func3(a,b):
# print(a,b)
# return 555
# print(func3(2,3))

# #函数的有用信息:
# def login(username,password):
# '''
# 此函数需要用户名,密码两个参数,完成的是登录的功能.
# :return:Ture 登录成功.False登录失败.
# :param username:
# :param password:
# :return:
# '''
# print('登录成功..')
# return True
# print(login.__name__) #打印函数名
# print(login.__doc__) #打印解释


# def wrapper(f):
# def inner(*args,**kwargs):
# print(f.__name__)
# print(f.__doc__)
# """执行函数之前的操作"""
# ret=f(*args,**kwargs)
# '''执行函数之后的操作'''
# return ret
# return inner()
# @wrapper
# def login(uername,password):
# '''此函数需要用户名,密码两个参数,完成的是登录的功能。
# :return: True 登录成功。 False登录失败。
# '''
# print('登录成功...')
# return True
# print(login.__name__)
# print(login.__doc__)
# login(1, 2)

# from functools import wraps
# def wrapper(f):
# @wraps(f)
# def inner(*args, **kwargs):
# """执行函数之前的操作"""
# ret = f(*args, **kwargs)
# """执行函数之后的操作"""
# return ret
# return inner
#
# @wrapper
# def login(username, password):
# """
# 此函数需要用户名,密码两个参数,完成的是登录的功能。
# :return: True 登录成功。 False登录失败。
# """
# a = 2
# c = 4
# print('登录成功...')
# return True
#
# print(login.__name__)
# print(login.__doc__)
# for i in login.__dict__:
# print(i)
# print(dir(login))

#带参数的装饰器

# import time
# def timer_out(flag1): #falg1 = flag
# def timer(f):
# def inner(*args, **kwargs):
# if flag1:
# start_time = time.time()
# time.sleep(0.3)
# ret = f(*args, **kwargs)
# end_time = time.time()
# print('执行效率%s' % (end_time-start_time))
# return ret
# else:
# ret = f(*args, **kwargs)
# return ret
# return inner
# return timer
#
# flag = True
# #func1=timer_out(func1) timer_out(flag1)=timer
# @timer_out(flag) # 1,步 timer_out(flag) == timer 2,@与timer结合,变成你熟悉的装饰器 @timer
# def func1():
# print(111)
#
#
# @timer_out(flag)
# def func2():
# print(222)
#
#
# @timer_out(flag)
# def func3():
# print(333)
#
# func1()
# func2()
# func3()

#错误案例
# count = 1
# def func4():
# count = count + 1
# print(count)
#
# func4()

# 局部只能引用全局的变量,不能修改,如果要修改,global。
def func4():
count = 3
def inner():
nonlocal count
count = count + 1
print(count)
func4()
# 子函数只能引用父函数的变量,不能修改,如果要修改,nonlocal。

#多个装饰器装饰器装饰一个函数
def wrapper1(func):
def inner1():
print('wrapper1,before func')
func()
print('wrapper1, after func')
return inner1
def wrapper2(func): # func = inner1
def inner2():
print('wrapper2,after func')
func() # inner1()
print('wrapper2 ,after func')
return inner2
@wrapper2 # f = wrapper2(f) 里面的f新变量 = inner1 外面的f最新变量 = inner2
@wrapper1 # f = wrapper1(f) 里面的f函数名 外面的f新变量=inner1
def f():
print('in f') # 3

f() # inner2()
'''
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func
'''


posted @ 2018-05-15 19:19  weilai小超人  阅读(466)  评论(0编辑  收藏  举报