当前位置: 首页 > 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.hkea.cn/news/757876/

相关文章:

  • 怎样建设公司网站小程序b2b网站大全免费
  • 百度抓取不到网站百度识图搜索图片来源
  • 企业网站栏目规划的重要性网络营销的概述
  • 公司网站建设找谁做免费发布推广信息网站
  • 虚拟币网站开发seo百度关键字优化
  • 网站建设都 包括哪些淄博网站制作
  • 自己做装修网站南宁百度推广seo
  • 品牌建设浅谈seo网络营销外包
  • 昆山网站建设兼职千锋教育的官网
  • cm域名做网站盘古百晋广告营销是干嘛
  • 网站栏目策划企业网络营销方案
  • 网站自动采集指标sem广告投放是做什么的
  • 想做一个个人网站怎么做培训学校
  • 网站开发ipv6升级如何创建自己的小程序
  • 做网站需要备案吗外贸网站推广与优化
  • 独立网站建设流程b站视频推广网站动漫
  • 泰安诚信的网站建设b站推广入口2023年
  • 高校网站建设资料库东莞seo推广公司
  • 电子印章手机在线制作软件四川seo整站优化费用
  • 个人风采网站制作外贸网站平台哪个好
  • 沈阳企业建站谷歌推广和seo
  • .la域名做的网站如何快速推广app
  • 广州优化网站建设怎么用手机制作网站
  • 做微网站的第三方学网络营销
  • 湖南做网站的公司有哪些搜索引擎是什么
  • flash网站管理系统seo优化排名易下拉用法
  • 永年网站建设友链互换平台推荐
  • 企业网站的设计公司网络广告营销的典型案例
  • 高校思政主题网站建设的意义关键词歌词任然
  • 哪里做网站比较快2345网址导航下载桌面