当前位置: 首页 > news >正文

做数据权威的网站有哪些上海专业做网站

做数据权威的网站有哪些,上海专业做网站,做网站开发一般用什么语言,重庆做网站建设哪里好Python之装饰器-无参装饰器 装饰器介绍 1. 为何要用装饰器 Python 中的装饰器是一种语法糖,可以在运行时,动态的给函数或类添加功能。装饰器本质上是一个函数,使用 函数名就是可实现绑定给函数的第二个功能 。将一些通用的、特定函数的功…

Python之装饰器-无参装饰器

装饰器介绍

1. 为何要用装饰器

  • Python 中的装饰器是一种语法糖,可以在运行时,动态的给函数或类添加功能。
  • 装饰器本质上是一个函数,使用 @ + 函数名就是可实现绑定给函数的第二个功能 。
  • 将一些通用的、特定函数的功能抽象成一个装饰器,可以重复利用这些功能

2. 什么是装饰器

  • “装饰”代指为被装饰对象添加新的功能,“器”代指器具/工具
  • 装饰器的作用:就是在不修改被装饰对象源代码和调用方式的前提下为被装饰对象添加额外的功能。
  • 装饰器使用场景:插入日志、性能测试、事务处理、缓存、权限校验
  • 可以调用的有:函数、方法、类
  • 函数装饰器分为:无参装饰器和有参装饰,二者都是使用都是需要【名称空间+函数嵌套+闭包+函数对象的组合知识】
  • 使用“@”符号定义装饰器,前提是需要有一个函数作为工具然后被“@”装饰到其他函数头上,为这个函数添加功能

无参装饰器

  • @符号后是一个函数
  • 虽然是无参装饰器,但是@后的函数本质上是单参函数

def add(x, y):print(add.__name__, x, y)return x + yadd(4, 5)# 此函数记录了,调用了add函数,x和y的值是什么
# 返回结果:add 4 5
# 返回结果:9
import time # 时间底层模块
print('------')
time.sleep(10)
print('******')# 导入time模块,执行第1个print后,time.sleep(10) 休眠10秒,然后输出第2个print
# 返回结果:------
# 返回结果:******
import datetime # 导入datetime模块start = datetime.datetime.now() # 设置start,获取当前时间# 导入datetime模块
end = datetime.datetime.now() # 设置end,获取当前时间# end变量在下一个代码块中执行,稍微等几秒错开时间。
start, end # 记录的两个时间戳,用于记录开始时间和结束时间
# 返回结果:(datetime.datetime(2024, 3, 23, 11, 4, 2, 337816), datetime.datetime(2024, 3, 23, 11, 4, 4, 518772))
(end - start).total_seconds() # total.seonds 总秒数# end 减去 start 获取运行的秒数
# 返回结果:2.180956
def add(x, y):#print(add.__name__, x, y) # 这个只能记录add,sub呢?#time.sleep(2) # 修秒2秒return x + ydef logger(fn):ret = fn(4, 5)return retlogger(add)# base版,基于这版,增加功能、
# 返回结果:9
def add(x, y):#print(add.__name__, x, y) # 这个只能记录add,sub呢?#time.sleep(2)return x + ydef logger(fn, x, y):ret = fn(x, y)return retlogger(add, 4, 5)# 返回结果:9
def add(x, y):#print(add.__name__, x, y) # 你这个只能记录add,sub呢?#time.sleep(2)return x + ydef logger(fn, x, y):print(fn.__name__, x, y) # 增加记录值ret = fn(x, y)return retlogger(add, 4, 5)# 返回结果:add 4 5
# 返回结果:9
def add(x, y):#mylog(add.__name__, x, y) # 你这个只能记录add,sub呢?#time.sleep(2)return x + ydef sub(x, y): # 可以用于多个函数return x - ydef logger(fn, x, y):print(fn.__name__, x, y) # 增加记录值ret = fn(x, y)return retlogger(add, 4, 5)
logger(sub, 5, 6)# 返回结果:add 4 5
# 返回结果:sub 5 6
# 返回结果:-1
def add(x, y):#mylog(add.__name__, x, y) # 你这个只能记录add,sub呢?#time.sleep(2)return x + ydef sub(x, y, z): # 可以用于多个函数return x - y - zdef logger(fn, *args, **kwargs): # 接受关键字传参,位置传参。print(fn.__name__, args, kwargs) # 增加记录值print('执行前可以做的事情,增强')ret = fn(*args, **kwargs)print('执行后可以做的事情,增强')return retlogger(add, 4, y=8)
logger(sub, 5, 6, z=7)# 返回结果:add (4,) {'y': 8}
# 返回结果:执行前可以做的事情,增强
# 返回结果:执行后可以做的事情,增强
# 返回结果:sub (5, 6) {'z': 7}
# 返回结果:执行前可以做的事情,增强
# 返回结果:执行后可以做的事情,增强
# 返回结果:-8
def add(x, y):#mylog(add.__name__, x, y) # 你这个只能记录add,sub呢?#time.sleep(2)return x + ydef sub(x, y, z): # 可以用于多个函数return x - y - zdef logger(fn):def inner(*args, **kwargs):print(fn.__name__, args, kwargs) # 增加记录值print('执行前可以做的事情,增强')ret = fn(*args, **kwargs)print('执行后可以做的事情,增强')return retreturn innerlogger(add)(4, y=8)
#logger(sub, 5, 6, z=7)# 返回结果:add (4,) {'y': 8}
# 返回结果:执行前可以做的事情,增强
# 返回结果:执行后可以做的事情,增强
# 返回结果:12
def add(x, y):#time.sleep(2)return x + ydef sub(x, y, z): # 可以用于多个函数return x - y - zdef logger(fn):def inner(*args, **kwargs):print('执行前可以做的事情,增强', fn.__name__, args, kwargs)ret = fn(*args, **kwargs)print('执行后可以做的事情,增强')return retreturn innerlogger(add)(4, y=8)
#logger(sub, 5, 6, z=7)# 返回结果:执行前可以做的事情,增强 add (4,) {'y': 8}
# 返回结果:执行后可以做的事情,增强
# 返回结果:12
def add(x, y):#time.sleep(2)return x + ydef sub(x, y, z): # 可以用于多个函数return x - y - zdef logger(fn): # fn adddef inner(*args, **kwargs):print('执行前可以做的事情,增强', fn.__name__, args, kwargs)ret = fn(*args, **kwargs) # fn(4, y=8) add(4, y=8)print('执行后可以做的事情,增强')return retreturn innert = logger(add) # t = inner
print(t(4, y=8)) # inner(4, y=8)# 返回结果:执行前可以做的事情,增强 add (4,) {'y': 8}
# 返回结果:执行后可以做的事情,增强
# 返回结果:12
def add(x, y):#time.sleep(2)return x + ydef logger(fn): # fn adddef inner(*args, **kwargs):print('执行前可以做的事情,增强', fn.__name__, args, kwargs)ret = fn(*args, **kwargs) # fn(4, y=8) add(4, y=8)print('执行后可以做的事情,增强')return retreturn inner#t = logger(add) # t = inner
#print(t(4, y=8)) # inner(4, y=8)add = logger(add)
print(add(4, 5))# 返回结果:执行前可以做的事情,增强 add (4, 5) {}
# 返回结果:执行后可以做的事情,增强
# 返回结果:9

请添加图片描述

def add(x, y):#time.sleep(2)return x + ydef logger(fn): # fn adddef inner(*args, **kwargs):print('执行前可以做的事情,增强', fn.__name__, args, kwargs)ret = fn(*args, **kwargs) # fn(4, y=8) add(4, y=8)print('执行后可以做的事情,增强')return retreturn inner#t = logger(add) # t = inner
#print(t(4, y=8)) # inner(4, y=8)
print(hex(id(add))) # 打印add的id值
add = logger(add)
print(add(4, 5))
print(add.__closure__) # 查看add的closure中记录闭包# 返回结果:0x10954fd80
# 返回结果:执行前可以做的事情,增强 add (4, 5) {}
# 返回结果:执行后可以做的事情,增强
# 返回结果:9
# 返回结果:(<cell at 0x1083e3d90: function object at 0x10954fd80>,)
def logger(fn): # fn adddef inner(*args, **kwargs):print('执行前可以做的事情,增强', fn.__name__, args, kwargs)ret = fn(*args, **kwargs) # fn(4, y=8) add(4, y=8)print('执行后可以做的事情,增强')return retreturn inner@logger # 装饰器 #等价式, add = logger(add) # logger应该等效为单参函数
def add(x, y):#time.sleep(2)return x + y#t = logger(add) # t = inner
#print(t(4, y=8)) # inner(4, y=8)
#add = logger(add)
print(add(4, 5))# @装饰器语法,@标识符,把这一行下面一行的def定义的标识符作为其实参传入,返回值覆盖了下面这个标识符
# 返回结果:执行前可以做的事情,增强 add (4, 5) {}
# 返回结果:执行后可以做的事情,增强
# 返回结果:9
def logger(fn): def inner(*args, **kwargs):print('执行前可以做的事情,增强', fn.__name__, args, kwargs)ret = fn(*args, **kwargs) print('执行后可以做的事情,增强')return retreturn inner@logger # 装饰器 #等价式, add = logger(add) # logger应该等效为单参函数
def add(x, y):#time.sleep(2)return x + yprint(add(4, 5)) # 非侵入代码,完成了功能,并且好像从来没有装饰过一样
print(add.__name__) #add实际是inner# 返回结果:执行前可以做的事情,增强 add (4, 5) {}
# 返回结果:执行后可以做的事情,增强
# 返回结果:9
# 返回结果:inner
def logger(wrapped): def wrapper(*args, **kwargs):print('执行前可以做的事情,增强', wrapped.__name__, args, kwargs)ret = wrapped(*args, **kwargs) print('执行后可以做的事情,增强')return retreturn wrapper@logger # 装饰器 #等价式, add = logger(add) # logger应该等效为单参函数
def add(x, y):#time.sleep(2)return x + yprint(add(4, 5)) # 非侵入代码,完成了功能,并且好像从来没有装饰过一样
print(add.__name__)# 返回结果:执行前可以做的事情,增强 add (4, 5) {}
# 返回结果:执行后可以做的事情,增强
# 返回结果:9
# 返回结果:wrapper
def logger(wrapped): def wrapper(*args, **kwargs):start = datetime.datetime.now()ret = wrapped(*args, **kwargs) delta = (datetime.datetime.now() - start).total_seconds()print("{} tooks {}s.".format(wrapped.__name__, delta))return retreturn wrapper@logger # 装饰器 #等价式, add = logger(add) # logger应该等效为单参函数
def add(x, y):time.sleep(2)return x + yprint(add(4, 5)) # 非侵入代码,完成了功能,并且好像从来没有装饰过一样
print(add.__name__) # 返回结果:add tooks 2.002051s.
# 返回结果:9
# 返回结果:wrapper
http://www.dinnco.com/news/46429.html

相关文章:

  • 可以做企业宣传的网站百度手机助手app下载安装
  • seo门户网站优化网站建站价格
  • 怎么做网站推推广文章的注意事项
  • 网站建设方案及报价单百度搜索网址大全
  • 公司给别人做的网站违法的吗网站优化外包
  • 重庆网站建设公司模板百度云电脑版网站入口
  • 大型的网站建设关键词排名优化教程
  • asp网站域名授权陕西seo公司
  • 静态网站怎么申请网站详细步骤
  • 网站建设费税率多少app推广拉新工作可靠吗
  • 小白怎么做淘宝客网站seo系统源码出售
  • 做网站的开源代码长春seo优化企业网络跃升
  • 公司网站域名如何申请成都最新疫情
  • 网站域名更换是怎么做的杭州seo按天计费
  • 沧州疫情最新情况福建seo关键词优化外包
  • 做我女朋友好不好套路网站交换友情链接的渠道
  • 乌鲁木齐网站建设报价外汇seo公司
  • 网络运营推广方式有哪些搜索引擎优化排名工具
  • 乐清门户网站网络营销外包推广
  • php做的静态网站怎么加密如何进行网站的推广
  • nodejs做企业网站淘宝指数官网入口
  • 如何选择网站营销公司互联网营销专业
  • html旅游网站制作代码bt种子搜索
  • 河北住房和城乡建设厅网站semester
  • 门户网站开发需求分析互联网销售模式
  • 头条网站开发中山seo推广优化
  • 手机视频网站建站广东省最新疫情
  • 做网站只有搜网址吗站长之家站长工具
  • 做音乐的网站设计手把手教你优化网站
  • 企业网站首页效果图设计与制作免费网页空间到哪申请