python_装饰器

# 装饰器形成的过程 : 最简单的装饰器 有返回值得  有一个参数  万能参数
# 装饰器的作用
# 原则 :开放封闭原则
# 语法糖:@装饰函数名
# 装饰器的固定模式

import time
# time.time()  # 获取当前时间
# time.sleep() # 等待
# 装饰带参数的装饰器
def timer(f):   # 装饰函数def inner(*args,**kwargs):start = time.time()ret = f(*args,**kwargs)  # 被装饰函数end = time.time()print(end-start)return retreturn inner
@timer         # 语法糖 @装饰器函数名  在被装饰函数的上面
def func(a):    #  被装饰的函数time.sleep(0.1)print('哈哈哈')return 'hello'# func = timer()

ret = func()  # inner
print(ret)

 




# 装饰器的作用 不想修改函数的调用方式 但是还想再原来的函数前后添加功能
# timmer 就是一个装饰函数,只是对一个函数 有一些装饰作用

# 原则:开放封闭原则
# 开放:对扩展是开放的
# 封闭:对修改是封闭的

# 装饰器的固定模式
def wrapper(f):   # 装饰器函数,f是被装饰的函数def inner(*args,**kwargs):'''在被装饰函数之前要做的事'''ret = f(*args,**kwargs)    # 被装饰的函数'''在被装饰函数之后要做的事'''return retreturn inner@wrapper     # func_name = wrapper(func_name)
def func_name():print(123)ret = func_name

 

装饰器的进阶
# functools.wraps
# 带参数的装饰器
# 多个装饰器装饰同一个函数
wrapsdef wahaha():'''打印这个函数'''pass
print(wahaha.__name__)  # 查看字符串格式函数名
print(wahaha.__doc__) # 查看函数注释from functools import wraps   # 引入wraps,全局被装饰的函数也能使用
def wrapper(f):@wraps(f)   # 在这里装饰inner  作用保留原有函数的名称和docstringdef inner(*args,**kwargs):'''在被装饰函数之前要做的事'''ret = f(*args,**kwargs)'''在被装饰函数之后要做的事'''return retreturn inner@wrapper     # func_name = wrapper(func_name)
def func_name():print(123)ret = func_nameprint(func_name.__name__)
# 带参数的装饰器
import time    # 引入时间模块
flage = False   # 定义一个全局变量
def timer_out(flage):   装饰器函数外面在裹一个函数def timer(func):def inner(*args,**kwargs):if flage:         # 加个判断start = time.time()ret = func(*args,**kwargs)end = time.time()print(end-start)return retelse:ret = func(*args,**kwargs)return retreturn innerreturn timer@timer_out(flage)   #这里要明白 timer_out(flage) = timer ,所以还是@timer  
def wahaha():time.sleep(0.1)print('hehei')@timer_out(flage)
def hel():time.sleep(0.1)print('lalala')wahaha()
hel()
# 多个装饰器装饰一个函数
def wrapper1(func):def inner1():print('wrapperl,before func')func()print('wrapper1 after func')return inner1def wrapper2(func):def inner2():print('wrapper2,before func')func()print('wrapper2 after func')return inner2@wrapper1
@wrapper2       #距离最近的先执行,这个要好好理解执行变化
def f():print('in f')
f()
# 1.编写装饰器,为多个函数加上认证的功能(用户的账户密码来源于文件)要求登录成功一次,后续的函数都无需再输入用户名和密码
flat = False   #定义一个全局变量 好像其他也能代替
def login(func):def inner(*args,**kwargs):global flat     # 这里不能用nonlocal声明'''先登录程序'''if flat:ret = func(*args,**kwargs)return retelse:username = input('username:')password = input('password:')if username == 'boss' and password == '666666':flat = Trueret = func(*args,**kwargs)return retelse: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 retreturn inner@log
def shoplist_add():print('增加一件物品')
@log
def shoplist_del():print('删除一件物品')

 

# 进阶作业(选做)
# 1.编写下载网页内容的函数,要求功能是:用户传入一个URL,函数返回下载页面的结果
from urllib.request import urlopen
def get(url):code = urlopen(url).readreturn code
ret =get('http://www.baidu.com')
print(ret)
#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)with open('web_cache','wb') as f:f.write(ret)return retreturn inner@cache
def get(url):code = urlopen(url).read()return coderet = get('http://www.baidu.com')
print(ret)

 

转载于:https://www.cnblogs.com/niunai/p/10553947.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

欧洲的数据中心与美国的数据中心如何区分?

人会想到这意味着,在欧洲和北美的数据中心的设计基本上不会有大的差异。不过,一些小的差异是确实存在的。您可能想知道为什么你需要了解欧洲和北美的数据中心之间的差异,这对你的公司有帮助吗?一个设计团队往往能从另一个设计团队那里学到东…

老农过河

java老农过河问题解决 http://www.52pojie.cn/thread-550328-1-1.html http://bbs.itheima.com/thread-141470-1-1.html http://touch-2011.iteye.com/blog/1104628 转载于:https://www.cnblogs.com/wangjunwei/p/6032602.html

python isalnum函数_探究Python中isalnum()方法的使用

探究Python中isalnum()方法的使用 isalnum()方法检查判断字符串是否包含字母数字字符。 语法 以下是isalnum()方法的语法: str.isa1num() 参数 NA 返回值 如果字符串中的所有字符字母数字和至少有一个字符此方法返回 true,否则返回false。 例子 下面的例…

docker快速入门_Docker标签快速入门

docker快速入门by Shubheksha通过Shubheksha Docker标签快速入门 (A quick introduction to Docker tags) If you’ve worked with Docker even for a little while, I bet you’ve come across tags. They often look like “my_image_name:1” where the part after the col…

动态规划算法——最长上升子序列

今天我们要讲的是最长上升子序列(LIS)。【题目描述】给定N个数,求这N个数的最长上升子序列的长度。【样例输入】      【样例输出】7        42 5 3 4 1 7 6那么什么是最长上升子序列呢? 就是给你一个序列…

如何快速掌握一门新技术/语言/框架

IT行业中的企业特点是都属于知识密集型企业。这种企业的核心竞争力与员工的知识和技能密切相关。而如果你在企业中扮演的是工程师的角色的话,那么 你的核心竞争力就是IT相关的知识与技能的储备情况。而众所周知,IT行业是一个大量产生新知识的地方&#x…

c语言今天星期几问题,C语言输入今天星期几

满意答案迷茫03222015.07.24采纳率&#xff1a;55% 等级&#xff1a;9已帮助&#xff1a;665人123456789101112131415161718192021#include<stdio.h>int main(void){ enum weekday{ sun, mon, tue, wed, thu, fri, sat }; int n; printf("输入星期数(0-…

备忘录模式 详解

定义 在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff1b; 行为型模式 角色 发起人角色&#xff08;Originator&#xff09;&#xff1a;记录当前时刻的内部状态&#xff0c;负责定义哪些属于备份范围的状态&#xf…

dll oem证书导入工具_技术干货 | 恶意代码分析之反射型DLL注入

欢迎各位添加微信号&#xff1a;qinchang_198231 加入安全 交流群 和大佬们一起交流安全技术01技术概要这是一种允许攻击者从内存而非磁盘向指定进程注入DLL的技术&#xff0c;该技术比常规的DLL注入更为隐蔽&#xff0c;因为除了不需要磁盘上的实际DLL文件之外&#xff0c;它…

像程序员一样思考_如何像程序员一样思考-解决问题的经验教训

像程序员一样思考by Richard Reis理查德里斯(Richard Reis) 如何像程序员一样思考-解决问题的经验教训 (How to think like a programmer — lessons in problem solving) If you’re interested in programming, you may well have seen this quote before:如果您对编程感兴趣…

CF908G New Year and Original Order 数位DP

传送门 看到数据范围到\(10^{700}\)毫无疑问数位DP。那么我们最重要的问题是如何有效地维护所有数位排序之后的数的值。 对于某一个数\(x\)&#xff0c;设\(f_{x,i} (i \in [1,9])\)表示\(x\)中的所有数位的值\(\geq i\)的数位数量&#xff0c;比如说\(f_{6345982 , 7} 2 , f_…

锐捷亮相GITC:请互联网企业为我点个赞!

【51CTO.com原创稿件】GITC全球互联网技术大会已成功举办四届&#xff0c;今年的会议现场依然是摩肩接踵围观者众。围绕互联网热点技术&#xff0c;众人根据云、大数据、安全、运维、基础架构的不同主题&#xff0c;各自聚成小圈子展开深入交流。 锐捷的展位在主会场的内侧&…

c语言汇编混合编程方法,C语言和汇编语言混合编程方法

摘要&#xff1a; C语言是一种高级的面向过程的开发语言&#xff0c;汇编语言是一种低级的面向机器的编程语言。两者在程序设计开发方面各有优劣&#xff0c;目前两者的混合编程得到了广泛的应用。本文通过具体的实例&#xff0c;说明了混合编程的基本方法&#xff0c;为C语言应…

WPF Slider设置整数

IsSnapToTickEnabled"True" 转载于:https://www.cnblogs.com/Fred1987/p/6038608.html

api代理提取_了解提取API

api代理提取Interested in learning JavaScript? Get my ebook at jshandbook.com有兴趣学习JavaScript吗&#xff1f; 在jshandbook.com上获取我的电子书 Since IE5 was released in 1998, we’ve had the option to make asynchronous network calls in the browser using X…

react.lazy 路由懒加载_React lazy/Suspense使用及源码解析

React v16.6.0已经发布快一年了&#xff0c;为保障项目迭代发布&#xff0c;没有及时更新react版本&#xff0c;最近由于开启了新项目&#xff0c;于是使用新的react版本进行了项目开发。项目工程如何搭建&#xff0c;如何满足兼容性要求&#xff0c;如何规范化等等这里不作为介…

Dart编程语言入门

Dart基础入门语法介绍&#xff0c;详细说明可以查看相关视频《Dart编程语言入门》。 变量与常量 变量 1.使用 var 声明变量,默认值为 null var a;//null a 10;2.显示类型声明 int a;//null a 10;3.使用 var 声明&#xff0c;可赋予不同类型的值 var a; //null a 10; //int a…

《PHP精粹:编写高效PHP代码》——1.1节为什么要使用面向对象编程

本节书摘来自华章社区《PHP精粹&#xff1a;编写高效PHP代码》一书中的第1章&#xff0c;第1.1节为什么要使用面向对象编程&#xff0c;作者&#xff1a;&#xff08;美&#xff09;  Davey Shafik&#xff0c;更多章节内容可以访问云栖社区“华章社区”公众号查看 1.1 为什…

c语言数据结构系统化,C语言数据结构+数据库+操作系统

http://cv.qiaobutang.com/post/55c419b20cf2009bd4607795第二部分是专业相关的C &#xff0c;数据库&#xff0c;操作系统&#xff0c;数据结构。http://c.biancheng.net/cpp/u/shuju/数据(Data)是信息的载体&#xff0c;它能够被计算机识别、存储和加工处理。它是计算机程序加…

c语言判断一个序列是不是另一个的子序列

1 #include <stdio.h>2 #include <string.h>//添加字符串头文件3 4 int Subsequence(char s[], char t[]) 5 {6 int m,n,i,j;7 n strlen(s); //n表示序列S的长度8 m strlen(t); //m表示序列T的长度9 i0; 10 j0; 11 if (m>…