1、基础

##装饰器本质上是一个闭包

 

def decotor(func):
# print("请先登录")
def inner(): ###在内部函数中对已有函数进行装饰
print("请先登录")
func()
return inner

@decotor ###装饰器语法糖写法 等价于comment=decotor(comment),以后comment=inner
def comment():
print("我发表评论")

# ##调用装饰器对函数进行装饰 commnet不在是comment而是 comment=inner
# comment=decotor(comment)
comment()

2、进阶
(1)理解
import time
def decorator(func):
def inner():
print(time.time())
return inner


@decorator
def work():
for i in range(90000):
print(i)



work()
(2)使用
import time
def decorator(func):
def inner():
start=time.time()
func()
end=time.time()
print(end-start)
return inner


@decorator
def work():
for i in range(990000):
print(i)



work()
3、通用装饰器


# def decorator(func):
# def inner(a,b):
# ###使用装饰器装饰函数的时候,内部函数和要装饰的函数保持一致
# print("正在努力加载")
# func(a,b)
# return inner
#
# @decorator
# def add(num1,num2):
# print(num1+num2)
#
# add(5,6)

# def decorator(func):
# def inner(a,b):
# ###使用装饰器装饰函数的时候,内部函数和要装饰的函数保持一致
# print("正在努力加载")
# result=func(a,b)
# return result
# return inner
#
# @decorator
# def add(num1,num2):
# result=num1+num2
# return result
#
# print(add(5,6))

def decorator(func):
def inner(*args,**kwargs):
###使用装饰器装饰函数的时候,内部函数和要装饰的函数保持一致
print("正在努力加载")
result=func(*args,**kwargs)
return result
return inner

@decorator
def add(*args,**kwargs):
result=0
for value in args:
result+=value
for value in kwargs.values():
result+=value
return result

print(add(4,56,85))

下面这个装饰器可以装饰任意函数
def decorator(func):
def inner(*args,**kwargs):
###使用装饰器装饰函数的时候,内部函数和要装饰的函数保持一致
print("正在努力加载")
result=func(*args,**kwargs)
return result
return inner
 
四、带有参数的转时期

def return_decorator(flag):
def decocator(func):
def inner(a,b):
if flag=='+':
print('加法正在执行')
if flag=='-':
print('减法法正在执行')
func(a,b)
return inner
return decocator



@return_decorator('+')
def add_number(num1,num2):
num=num1+num2
print(num)

@return_decorator('-')
def sub_number(num1,num2):
num=num1-num2
print(num)

add_number(2,6)
sub_number(5,9)

####带有参数的装饰器,其实是定义了一个带有参数的函数,让函数接受参数,返回值是装饰器