python编程装饰器
装饰器import datetime def f1(): print("this is a fnction") # 定义是打印一句话 def f1(): print(f"{datetime.datetime.today():%Y-%m-%d}") print("this is a fnction") f1() 2021-12-28 this is a fnction
业务需求,需要添加打印时间的需求,完成了需求。如果有100个函数都要打印时间的功能 违背了开闭原则:修改是封闭的,扩展是开放的(需求变更,扩展函数/类) def f2(): print("this is a fnction") # 利用函数特性,专门编写一个打印时间的函数 # 函数式编程的原理,函数是可以作为另外一个参数传进来的 def time_print(func): print(f"{datetime.datetime.today():%Y-%m-%d}") func() time_print(f2) time_print(f2) time_print(f2) 2021-12-28 this is a fnction 2021-12-28 this is a fnction 2021-12-28 this is a fnction
没有体现出和f2的关联性 不够优雅,打印时间这个需求是属于函数本身的并不是属于新增加的这个函数,函数执行之前强行的加打印时间,并不符合函数的特性 # 无区别 print(f"{datetime.datetime.today():%Y-%m-%d}") f1() print(f"{datetime.datetime.today():%Y-%m-%d}") f2() 2021-12-28 2021-12-28 this is a fnction 2021-12-28 this is a fnction
有没有方法让我们这个新添加的逻辑和老函数可以绑定在一起,体现老函数功能增加,但又不去改这个函数呢,这就是装饰器要去解决的问题 # 装饰器 def decorator(func): # 装饰器实现外部函数 实现装饰器需要嵌套函数定义方式 def wrapper(): # 被封装 新增加的业务逻辑加入进来 # 无参数 print(f"{datetime.datetime.today():%Y-%m-%d}") func() return wrapper def f3(): print("this is a fnction") f = decorator(f3) f() 2021-12-28 this is a fnction
像闭包的行为 f是个函数 这样的写法内聚性高一些 定义一个嵌套函数,调用的时候还不能直接调用原来这个函数来使用,先用这个装饰器作为一个函数,把f3作为参数传到里面去, 一个变量接受它,变量的方式间接调用函数 增加了时间函数后,依然可以调用原来的函数来实现新增加的功能 装饰器 提供了一个语法糖 @ @decorator def f4(): print("this is a fnction f4") # 没有改变函数实现和调用的方式,以前是调f1现在也是 f4()2021-12-28 this is a fnction f4
装饰器带参数带一个参数 def decorator(func): # 装饰器实现外部函数 实现装饰器需要嵌套函数定义方式 def wrapper(name): # 被封装 新增加的业务逻辑加入进来 # 无参数 print(f"{datetime.datetime.today():%Y-%m-%d}") func(name) return wrapper @decorator def f5(name): print("this is a fnction f5" + name) # 没有改变函数实现和调用的方式,以前是调f1现在也是 f5("name")2021-12-28 this is a fnction f5name
带多个参数 def decorator(func): # 装饰器实现外部函数 实现装饰器需要嵌套函数定义方式 def wrapper(*name): # 被封装 新增加的业务逻辑加入进来 # 无参数 print(f"{datetime.datetime.today():%Y-%m-%d}") func(*name) return wrapper @decorator def f6(name1, name2): print("this is a fnction f6" + name1) print("this is a fnction f6" + name2) f6("name1", "name2") 2021-12-28 this is a fnction f6name1 this is a fnction f6name2
关键字参数
完整的形式 def decorator(func): # 装饰器实现外部函数 实现装饰器需要嵌套函数定义方式 def wrapper(*name, **kwname): # 被封装 新增加的业务逻辑加入进来 # 无参数 print(f"{datetime.datetime.today():%Y-%m-%d}") func(*name, **kwname) # 不知参数传什么 return wrapper @decorator def f7(name1, name2, **kwname): print("this is a function f7" + name1) print("this is a function f7" + name2) print(kwname) f7("name1", "name2", a=1, b=2, c=3) 2021-12-28 this is a function f7name1 this is a function f7name2 {"a": 1, "b": 2, "c": 3}
@decorator def f8(name1): print("this is a function f8" + name1) f8("name1") 2021-12-28 this is a function f8name1
@decorator def f9(name1, name2): print("this is a function f9" + name1) print("this is a function f9" + name2) f9("name1", "name2") 2021-12-28 this is a function f9name1 this is a function f9name2
思想 什么地方用 被封装的单元比如函数要修改的时候,不想改变原来函数的实现,使用装饰器,稳定性 时间,代码复用
函数可以有很多个装饰器# 函数可以有很多个装饰器 def print_time(func): def wrapper(key): print(f"{datetime.datetime.today():%Y-%m-%d}") func(key) return wrapper def get_info(func): def wrapper(key): func(key) if key == "1": print("info") return wrapper @print_time @get_info def f10(key): print("查找资料") f10("1")2021-12-28 查找资料 info
虚报三份财报,海马汽车终收监管函海马汽车在边缘化的道路上越陷越深。11月1日,深交所对海马汽车下发监管函。监管函指出,2021年月4月23日,海马汽车披露了关于会计差错更正的公告,对2020年第一季度报告半年度报
特斯拉市值破万亿比亚迪拒绝苹果长城专注造汽车01hr特斯拉市值破万亿,中国市场成重要助推力据外媒报道,北京时间10月26日凌晨,全球连锁汽车租赁品牌赫兹(Hertz)宣布向特斯拉订购10万辆电动汽车,以在2022年底前建立电
小鹏汽车势如破竹!10月交付10138台,连续两月破万正所谓金九银十,这样的定律,在汽车圈里永不过时。在刚刚过去的金秋10月,不少车企都是收获到了丰盛的成绩单。比如身为造车新势力第一梯队的小鹏汽车。11月第一天本周的第一个工作日距离打
大安全,高合汽车的一个注脚电动化高端化,一定会是未来的趋势,但中国汽车品牌在高端电动市场的强势还是超出了很多人的预料。据乘联会发布的9月份乘用车销量排行榜,在50万以上豪华品牌电动车销量排名中,排名前三的分
让用户参与企业营销,挖掘产品娱乐优势现在很多企业在做营销时,一般都是从客户和产品功能上下功夫,如在用户常去地方做广告牌宣传,在用户常看的频道做广告等等,虽然这种做法无可厚非,但是在互联网的今天,仅凭这一种做法是很难获
智能垃圾桶帮你自动打包封袋,解放双手,与细菌零接触最近工作有点忙,好久没给大家带来好物推荐了,有数马上搬新房了,一直在选购提升品位的居家好物件。今天给大家带来一款townew拓牛智能垃圾桶。这是一款与众不同的智能垃圾桶,在大家心里
千元内电脑椅,六大工学设计,值得入手吗?劳神费心的装修计划终于进行到一大半,最近有数准备给新房选购一把椅子,以前使用定做的实木水曲柳电脑椅,长时间坐着不仅屁股痛,因实木的原因倚靠对后背也不舒服,总之,这次必须买一把舒服的
无线耳机是否能彻底替代有线耳机?关于这个争论在论坛上讨论和争辩很厉害,不少人认为将来一定是无线耳机的天下,有线耳机一定会被淘汰,这些用户以数码用户比较多,而HIFI用户则还是认为HIFI脱离不开有线耳机,无线是走
颜值最高的减震舒缓拖鞋,给你满满的踩死感,助力夏天最靓的仔今年的夏天特别热,属于肥胖中人的有数就不喜欢夏季,有数决定今年夏天穿的宽松休闲点,多少抵挡一下高温天气,近日选购了一双拖鞋,作为一整个夏季的通勤鞋。并且现在穿拖鞋出门还会定义成有钱
淘宝70的衣服拼多多39,发退货地址相同,小姐姐曝光电商秘密拼多多39元的衣服,淘宝卖70!最近,有位小姐姐爆料,她分别在淘宝和拼多多买了件同款衣服,到货后却发现衣服的质量气味以及上身效果都一模一样,只是淘宝这件买成70元,拼多多39元。而
平头耳塞的消亡史续在前几天的文章中谈到了平头耳塞的消亡史,我没想到真的有很多条友对入耳式不适应,当然也有一些条友对平头塞不适应,纷纷吐槽对方的设计不合理。我给个小贴士,平头塞如果不戴海绵套,真的是不