装饰器

Posted night-rain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。

1."""
闭包函数
1.闭:定义在函数内部的函数
2.包:内部函数引用了外部函数作用域的名字
"""
2.装饰器简介
"""
装饰器:
器:就是一个工具
装饰:给被装饰对象添加新的功能

为什么要用装饰器
开放封闭原则:
开放:对扩展开放
封闭:对修改封闭

装饰器(可调用对象)必须遵循的两个原则:
1.不改变被装饰对象源代码
2.不改变被装饰对象(可调用对象)调用方式
def index():
pass
index()

如何用
"""
# import time
# print(time.time())
# 1562812014.731474 时间戳 当前时间距离1970-1-1 00:00:00相差的秒数
# 1970-1-1 00:00:00是Unix诞生元年


# time.sleep(3) # 让cpu谁三秒 让你的程序暂停三秒
# print(‘FBI warning!‘)


"""
1.统计index函数执行的时间
"""
import time


def index():
time.sleep(3)
print(‘澳门最大线上赌场开业啦 性感tank在线发牌!‘)


start = time.time()
index()
end = time.time()
print(‘index run time:%s‘ % (end - start))

3.一个简单的装饰器
import time


def index():
time.sleep(3)
print(‘澳门最大线上赌场开业啦 性感tank在线发牌!‘)
return ‘index‘


res1 = index()


def login(name):
time.sleep(1)
print(‘%s is sb‘ % name)
return ‘login‘


res = login(‘egon‘)


def outter(func): # func = 最原始的login函数的内存地址
def get_time(*args, **kwargs): # args = (‘egon‘,) kwargs =
start = time.time()
res = func(*args, **kwargs) # 最原始的login函数的内存地址() 直接调用 func(‘egon‘)
end = time.time()
print(‘func run time:%s‘ % (end - start))
return res

return get_time


# login = outter(login) # outter(最原始的login函数的内存地址)
# res = login(‘egon‘)
# print(res)
# index = outter(index)
# res1 = index()
# print(res1)
"""
函数参数的问题
无参函数和有参函数都可以直接调用???
函数可以接收任意数量的参数

"""
4.装饰器语法糖与修复
from functools import wraps # 导入修复模块
def outter(func):
@wraps(func) # 装饰器修复技术
def inner(*args,**kwargs):
"""
我是inner函数
:param args:
:param kwargs:
:return:
"""
print(‘执行被装饰函数之前 你可以执行的操作‘)
res = func(*args,**kwargs)
print(‘执行被装饰函数之后 你可以执行的操作‘)
return res
return inner

@outter # index = outter(最原始的index内存地址)
def index():
"""
这是index函数
:return:
"""
pass


print(index)
print(help(index)) # 查看函数的注释
print(index.__name__) # 查看函数名字符串形式
index()
"""
用户查看被装饰函数的函数名的时候查看到的就是被装饰函数本身
用户查看被装饰函数的注释的时候查看到的就是被装饰函数的注释
"""
5.多层装饰
def outter1(func1):
print(‘加载了outter1‘)
def wrapper1(*args,**kwargs):
print(‘执行了wrapper1‘)
res1=func1(*args,**kwargs)
return res1
return wrapper1
def outter2(func2):
print(‘加载了outter2‘)
def wrapper2(*args,**kwargs):
print(‘执行了wrapper2‘)
res2=func2(*args,**kwargs)
return res2
return wrapper2
def outter3(func3):
print(‘加载了outter3‘)
def wrapper3(*args,**kwargs):
print(‘执行了wrapper3‘)
res3=func3(*args,**kwargs)
return res3
return wrapper3
@outter1 # index = outter1(wapper2)
@outter2 # wrapper2 = outter2(wrapper3)
@outter3 # wrapper3 = outter3(最原始的index函数内存地址)
def index():
print(‘from index‘)

"""
加载了outter3
加载了outter2
加载了outter1

执行了wrapper1
执行了wrapper2
执行了wrapper3
from index
"""
index()

以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python 装饰器:装饰器实例类装饰器(装饰函数)

装饰器、装饰器类与类装饰器(三)

Python进阶装饰器(Decorator)

python 装饰器:装饰器实例内置装饰器

python 装饰器:装饰器实例内置装饰器

TS之装饰器