1.复习

# 复习
# 讲作业
# 装饰器的进阶# functools.wraps# 带参数的装饰器# 多个装饰器装饰同一个函数
# 周末的作业# 文件操作# 字符串处理# 输入输出# 流程控制# 装饰器
# 开发原则 : 开放封闭原则
# 装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能
# 装饰器的本质 : 闭包函数# def wrapper(func):
#     def inner(*args,**kwargs):
#         print('在被装饰的函数执行之前做的事')
#         ret = func(*args,**kwargs)
#         print('在被装饰的函数执行之后做的事')
#         return ret
#     return inner
#
# @wrapper   #holiday = wrapper(holiday)
# def holiday(day):
#     print('全体放假%s天'%day)
#     return '好开心'
#
# ret = holiday(3)
# print(ret)# def outer(*args):
#     print(args)
#     print(*args)
#     def inner(*args):
#         print('inner : ',args)
#     inner(*args)
#
#
# outer(1,2,3,4)   #==outer(*[1,2,3,4])  #==outer(*(1,2,3,4))

View Code

2.作业

# 1.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),
# 要求登录成功一次,后续的函数都无需再输入用户名和密码
# FLAG = False
# def login(func):
#     def inner(*args,**kwargs):
#         global FLAG
#         '''登录程序'''
#         if FLAG:
#             ret = func(*args, **kwargs)  # func是被装饰的函数
#             return ret
#         else:
#             username = input('username : ')
#             password = input('password : ')
#             if username == 'boss_gold' and password == '22222':
#                 FLAG = True
#                 ret = func(*args,**kwargs)      #func是被装饰的函数
#                 return ret
#             else:
#                 print('登录失败')
#     return inner
#
# @login
# def shoplist_add():
#     print('增加一件物品')
#
# @login
# def shoplist_del():
#     print('删除一件物品')
#
# shoplist_add()
# shoplist_del()# 2.编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将被调用的函数名称写入文件
# def log(func):
#     def inner(*args,**kwargs):
#         with open('log','a',encoding='utf-8') as f:
#             f.write(func.__name__+'\n')
#         ret = func(*args,**kwargs)
#         return ret
#     return inner
#
# @log
# def shoplist_add():
#     print('增加一件物品')
#
# @log
# def shoplist_del():
#     print('删除一件物品')# shoplist_add()
# shoplist_del()
# shoplist_del()
# shoplist_del()
# shoplist_del()
# shoplist_del()# 进阶作业(选做):
# 1.编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
# 2.为题目1编写装饰器,实现缓存网页内容的功能:
# 具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中
import os
from urllib.request import urlopen
def cache(func):def inner(*args,**kwargs):if os.path.getsize('web_cache'):with open('web_cache','rb') as f:return f.read()ret = func(*args,**kwargs)  #get()with open('web_cache','wb') as f:f.write(b'*********'+ret)return retreturn inner@cache
def get(url):code = urlopen(url).read()return code# {'网址':"文件名"}
ret = get('http://www.baidu.com')
print(ret)
ret = get('http://www.baidu.com')
print(ret)
ret = get('http://www.baidu.com')
print(ret)

View Code

3.wraps

from functools import wraps
def wrapper(func):  #func = holiday
    @wraps(func)def inner(*args,**kwargs):print('在被装饰的函数执行之前做的事')ret = func(*args,**kwargs)print('在被装饰的函数执行之后做的事')return retreturn inner@wrapper   #holiday = wrapper(holiday)
def holiday(day):'''这是一个放假通知'''print('全体放假%s天'%day)return '好开心'print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3)   #inner
print(ret)# def wahaha():
#     '''
#     一个打印娃哈哈的函数
#     :return:
#     '''
#     print('娃哈哈')# print(wahaha.__name__) #查看字符串格式的函数名
# print(wahaha.__doc__)  #document

View Code

4.装饰器进阶

#带参数的装饰器
#500个函数
# import time
# FLAGE = False
# def timmer_out(flag):
#     def timmer(func):
#         def inner(*args,**kwargs):
#             if flag:
#                 start = time.time()
#                 ret = func(*args,**kwargs)
#                 end = time.time()
#                 print(end-start)
#                 return ret
#             else:
#                 ret = func(*args, **kwargs)
#                 return ret
#         return inner
#     return timmer
# # timmer = timmer_out(FLAGE)
# @timmer_out(FLAGE)    #wahaha = timmer(wahaha)
# def wahaha():
#     time.sleep(0.1)
#     print('wahahahahahaha')
#
# @timmer_out(FLAGE)
# def erguotou():
#     time.sleep(0.1)
#     print('erguotoutoutou')# wahaha()
# erguotou()#多个装饰器装饰一个函数
def wrapper1(func):def inner1():print('wrapper1 ,before func')ret = func()print('wrapper1 ,after func')return retreturn inner1def wrapper2(func):def inner2():print('wrapper2 ,before func')ret = func()print('wrapper2 ,after func')return retreturn inner2def wrapper3(func):def inner3():print('wrapper3 ,before func')ret = func()print('wrapper3 ,after func')return retreturn inner3@wrapper3
@wrapper2
@wrapper1
def f():print('in f')return '哈哈哈'print(f())#记录用户的登录情况
#计算这个函数的执行时间

View Code

转载于:https://www.cnblogs.com/xingqisan/p/10712556.html

day12装饰器进阶相关推荐

  1. day12 装饰器进阶

    day12 装饰器进阶 #装饰器进阶 #functools.wraps #带参数的装饰器 #多个装饰器装饰用一个函数 def outer(*args,**kwargs):#接收的时候是聚合(成元祖的形 ...

  2. python基础学习-装饰器进阶

    #__author:"Feng Lin" #date: 2018/8/30 #装饰器进阶 # functool.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数from ...

  3. python进阶20装饰器

    原创博客地址:python进阶20装饰器 Nested functions Python允许创建嵌套函数,这意味着我们可以在函数内声明函数并且所有的作用域和声明周期规则也同样适用. 1 2 3 4 5 ...

  4. day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)

    day11:装饰器(装饰器形成.装饰器作用.@语法糖.原则.固定模式) 装饰器形成:最简单的.有返回值的.有一个参数的.万能参数 函数起的作用:装饰器用于在已经完成的函数前后增加功能 语法糖:使代码变 ...

  5. python重难点之装饰器详解

    背景 虽然之前看过装饰器的相关内容,但是今天想起来,一直没有好好总结一下,所以特地记录下关于装饰器的一系列用法. 要想理解装饰器首先要明确颇python中的三个概念: 1.一切函数皆为对象 2.高阶函 ...

  6. python之函数三装饰器

    装饰器形成的过程 装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后加功能 原则:开发封闭原则 开发:对扩展是开发的 封闭:对修改是封闭的 装饰器的固定模式 计算运行时间 1 import ...

  7. python:装饰器

    前言 闭包 nonlocal 语句 装饰器 装饰器进阶:装饰器流程详解 装饰器进阶:带参数的装饰器 装饰器进阶:类装饰器 装饰器进阶:functools.wraps 装饰器进阶:多装饰器的执行顺序 装 ...

  8. python装饰器setter实现原理_python装饰器、描述符模拟源码实现

    概要 本人python理论知识远达不到传授级别,写文章主要目的是自我总结,并不能照顾所有人,请见谅,文章结尾贴有相关链接可以作为补充 全文分为三个部分装饰器理论知识.装饰器应用.装饰器延申 装饰理基础 ...

  9. Python-理解装饰器

    文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say():return "Hello" 打印出如 ...

最新文章

  1. ubuntu中如何使用中文输入法
  2. Feign使用Hystrix无效原因及解决方法
  3. ACM入门之【分块习题】
  4. win10运行C语言的程序,win10系统运行软件提示应用程序发生异常0xc0000409的具体教程...
  5. [ js处理表单 ]:保存、提交
  6. 限时秒杀┃秒杀90%的玩具,让孩子爱上科学的彩虹实验2来了!
  7. c++面向对象高级编程 学习三 堆、栈和内存泄漏
  8. 20道有代表性的HTML基础题,测测你能入前端的门吗
  9. 2020年,把i3 4170升级成e3 1231 v3有必要吗,顺便我想把750Ti换成1650s?
  10. [面试] 算法(八)—— 树
  11. 二维光子晶体带隙仿真Matlab完全程序_平面波展开法
  12. 2021-2022年数学建模资料汇总——建模软件篇
  13. PgAdmin3 LST v1.23.0.b (BigSQL) which support pg10.4
  14. android10存储空间不足怎么清理,手机磁盘空间不足怎么清理?详细介绍
  15. 软件规模估算常用的5种方法及实用工具。
  16. ARM学习-GNU ARM汇编
  17. ssm项目——CRM客户管理系统开发准备
  18. MyBatis+PageHelper实现分页
  19. 【Mongo】.wt文件数据恢复
  20. 用html写个人简历(学生学习所用)

热门文章

  1. IE-OLD IE 提示
  2. vue项目中遇到的一些问题
  3. How to determine what causes a particular wait type
  4. 解决Eclipse里Maven工程报 An error occurred while filtering resources错误
  5. Ubuntu 中Eclipse 默认的OpenJDK 和 SUNJDK问题总结
  6. 【WPF】使用 XAML 的 Trigger 系统实现三态按钮
  7. 什么是集群(cluster)
  8. C# Linq获取两个List或数组的差集交集
  9. Silverlight Dispatcher 类
  10. 设置asp.net网站的信任等级