Python函数06/装饰器

内容大纲

1.装饰器

1.装饰器

1.1 开放封闭原则

扩展是开放的(增加新功能)
修改源码是封闭的(修改已经实现的功能) 在不修改源码及调用方式的前提下额外增加新的功能

1.2 装饰器

用来装饰的工具

版一:
import time
starrt_time = time.time()
def func():
time.sleep(2) #睡眠 (模拟网络延时)
print("你好")
func()
print(time.time()-start_time) # start_time = time.time()
# def foo():
# time.sleep(3) #睡眠 (模拟网络延时)
# print("我是小明,我飞的比你高")
# foo()
# print(time.time() - start_time) 版二:
def times(f):
start_time = time.time()
f()
print(time.time() - start_time)
def foo():
time.sleep(3)
print("我好") def func():
time.sleep(1)
s = func
func = times
func(s) 版三 (初识版装饰器)
def times(f):
def inner():
start_time = time.time()
f()
print(time.time() - start_time)
return inner
def foo():
time.sleep(1)
print("大家好")
foo = times(foo)
foo() 版四 (第二版装饰器)
def wrapper():
def inner():
print(1)
return inner #切记inner后面不要加括号
def func():
print(2)
func = wrapper(func)
func() # def wrapper(f):
# def inner():
# print(f)
# return inner # 切记不要加括号
# wrapper("alex") # def wrapper(f):
# def inner():
# f()
# return inner # 切记不要加括号
#
# def func():
# print("这是func函数,李业还是不行")
# func = wrapper(func)
# func() def wrapper(f):
def inner(*args,**kwargs):
f(*args,**kwargs) #func(" ")
return inner #切记不要加括号()
def func(*args,**kwargs):
print(f"haodi{args}")
func = wrapper(func)
func("nihao","wohao") low版
import time
def wrapper(f):
def inner(*args,**kwargs):
"被装饰前"
start_time = time.time()
f(*args,**kwargs) #func()
print(time.time() - start_time)
"被装饰后"
return inner
def func(*args,**kwsrgs):
print("nihao")
time.sleep(2)
func = wrpper(func)
func("nihao","wohao") 高级
import time
def wrapper(f):
def inner(*args,**kwargs):
"被装饰前"
start_time = time.time()
f(*args,**kwargs) #func()
print(time.time() - start_time)
"被装饰后"
return inner
@wrapper #相当于 func=wrapper(func)
def func(*args,**kwsrgs):
print("nihao")
time.sleep(2)
func("nihao","wohao") 语法糖 --- 甜 @
语法糖必须放在被装饰的函数的正上方 # import time
# def wrapper(f):
# def inner(*args,**kwargs):
# "被装饰前"
# start_time = time.time()
# ret = f(*args,**kwargs) # func("alex")
# print(time.time() - start_time)
# "被装饰后"
# return ret
# return inner # 切记不要加括号
#
# @wrapper # func = wrapper(func)
# def func(*args,**kwargs):
# print(f"这是{args}函数,李业还是不行")
# time.sleep(2) #模拟网络延时
# return "alex"
# print(func())

装饰器返回值的传递

login_dic = {
"username": None,
"flag": False
} def auth(f):
def inner(*args,**kwargs):
if login_dic["flag"]:
return f()
else:
return login()
return inner @auth #index = auth(index)
def index():
print(f"这是{login_dic['username']}主页")
return "主页没有内容" def login():
print("这是一个登录页面")
user = input("username:")
pwd = input("password:")
if user == "baoyuan" and pwd == "baoyuan123":
login_dic["flag"] = True
login_dic["username"] = user
return
else:
return "用户名或密码错误!"
@auth #comment = auth(comment)
def comment():
print(f"这是{login_dic['username']}评论") while not login_dic["flag"]:
print(comment())

2.今日练习

# 1.整理今天的笔记以及课上代码,以及代码的执行流程.
#
# 2.将模拟博客园使用装饰器进行编写.
# login_dic = {
# "username": None,
# "flag": False
# }
# def auth(f):
# def inner(*args,**kwargs):
# if login_dic["flag"]:
# return f()
# else:
# return login()
# return inner
#
# @auth
# def index():
# print(f"这是{login_dic['username']}主页")
# return "主页没有内容"
#
# def login():
# print("这是一个登录页面")
# user = input("username:")
# pwd = input("password:")
# if user == "baoyuan" and pwd == "baoyuan123":
# login_dic["flag"] = True
# login_dic["username"] = user
# return "登录成功!" # else:
# return "用户名或密码错误!"
#
# @auth
# def comment():
# return f"这是{login_dic['username']}评论"
# #
# while not login_dic["flag"]:
# if login() == "登录成功!":
# print("登陆成功!")
# print(comment())
# else:
# print(login())
#
# 3.看代码写结果:
# def wrapper(f):
# def inner(*args,**kwargs):
# print(111)
# ret = f(*args,**kwargs)
# print(222)
# return ret
# return inner
#
# def func():
# print(333)
#
# print(444)
# func()
# print(555)
# 444
# 333
# 555
#
# 4.编写装饰器, 在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里’.
# def wrapper(func):
# def inner():
# print("每次执行被装饰函数之前都得先经过这里")
# func()
# return inner
# @wrapper
# def func():
# print("这是被装饰的函数")
# func()
#
5.为函数写一个装饰器,把函数的返回值 + 100然后再返回。
# def wrapper(func):
# def inner():
# ret = func()
# return ret+100
# return inner
# @wrapper
# def func():
# return 7
# result = func()
# print(result)
#
6.请实现一个装饰器,通过一次调用使被装饰的函数重复执行5次。
# def wrapper(func):
# def inner():
# for i in range(5):
# func()
# return inner
# @wrapper
# def func():
# return "这是被装饰的函数"
# func()
#
# 7.请实现一个装饰器,每次调用函数时,将被装饰的函数名以及调用被装饰函数的时间节点写入文件中。
# 可用代码:
# import time
# struct_time = time.localtime()
# print(time.strftime("%Y-%m-%d %H:%M:%S", struct_time)) # 获取当前时间节点
#
# def func():
# print(func.__name__())
# 函数名通过: 函数名.__name__获取。
# import time
# def wrapper(func):
# def inner():
# struct_time = time.localtime()
# a = time.strftime("%Y-%m-%d %H:%M:%S", struct_time)
# b = func.__name__
# with open("info","a",encoding="utf-8") as f:
# f.write(f'调用时间点:{a},函数名:{b}\n')
# return inner
# @wrapper
# def func():
# print("这是被装饰的函数")
# func()

Python函数06/装饰器的更多相关文章

  1. python——函数之装饰器

    1 问题 实际生活中,我们很难一次性就把一个函数代码写得完美无缺.当我们需要对以前的函数添加新功能时,我们应该怎么做? 2 问题解决思路 (1)可以直接修改原来的函数,在函数内直接修改.当我们对多个函 ...

  2. python函数、装饰器、迭代器、生成器

    目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递 ...

  3. Python 函数之装饰器

    1.函数 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ...

  4. python函数闭包-装饰器-03

    可调用对象 callable()  # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即  callable(对象)  返回为  True  的对象 x = 1 print(cal ...

  5. Python函数的装饰器修复技术(@wraps)

    @wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ...

  6. Python函数的装饰器修复技术(@wraps)

    @wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ...

  7. Python函数加工厂-装饰器

    引言: 函数和装饰器好比程序界的加工厂: 1.函数一般可用来加工一种或者多种数据类型的数据:字符串.数字.列表.字典等 举一个简单例子:已知半径求面积 def s(r): s = 3.14 * r * ...

  8. Python函数的装饰器

    函数的装饰器. 1. 装饰器 开闭原则: 对功能的扩展开放 对代码的修改是封闭 通用装饰器语法: def wrapper(fn): def inner(*args, **kwargs): # 聚合 & ...

  9. python 函数之装饰器,迭代器,生成器

    装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...

随机推荐

  1. c++ vector基本函数、排序、查找用法

    vector用法目录: 1.基本用法 2.vector的删除操作 3.vector的sort排序 4.翻转vector中的所有元素 5.find()函数的用法 6.vector实战(这里写的是我在最开 ...

  2. ado.net Web前端:关于JavaScript知识点的简单梳理

    学习js:1.htmml2.cssjs+html+css == html5 js的组成:1).ecamscript ES是js的标准,js 是es 的实现2)文档对象模型(Document Objec ...

  3. 用VC++6.0,双击主对话框中的按钮时,不能跳转到代码处

    1. 首先在项目中--[生成]build--[清除解决方案]clean 2. 关闭项目 3. 删除项目中的[Debug]下所有文件 4. 把*.aps,*.clw,*.ncb,*.opt删掉----- ...

  4. 'ipconfig' 不是内部或外部命令,也不是可运行的程序 或批处理文件

    今天在学习的时候需要找本地ip地址,可是在命令行窗口却显示 百度之后发现原来是环境变量没配置的问题(其实之前是ok的,但应该是anconda安装的时候点了那个一键设置环境变量搞得本地的path里的数据 ...

  5. Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?

    在 C/C++/Java 等等语言中,整型变量的自增或自减操作是标配,它们又可分为前缀操作(++i 和 --i)与后缀操作(i++ 和 i--),彼此存在着一些细微差别,各有不同的用途. 这些语言的使 ...

  6. 【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?

    写在前面 在<[Spring注解驱动开发]如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!>一文中,我们讲述了如何使用@Bean注解来指定bean初始化和销毁的方法.具体的 ...

  7. 为页内的tab添加的iframe添加加载动画过渡效果

    var iframe = $("iframe[data-id=" + id + " ]"); if (iframe.length > 0) { var e ...

  8. cookie,session,jwt,token,oauth2联系和区别

    为啥有这么多的东西? 由于互联网在刚开始设计的时候是展现静态网页为主,没有现在这么多的交互和互动,所以被设计为了无状态,随用随走的简单模式.随着互联网的发展,各种具有和用户交互功能的网站出现,要求用户 ...

  9. 车辆运动控制算法——MPC

    MPC是模型预测控制算法,在车辆运动跟踪轨迹的控制中发挥很大的优势 基础的不多说,下面记录我对LQR/MPC/二次规划问题的理解 我们从LQR来引出MPC LQR的能量函数,目的是求函数J最小,即用最 ...

  10. Java工具类——日期相关的类

    前言 在日常的开发工作当中,我们经常需要用到日期相关的类(包括日期类已经处理日期的类),所以,我就专门整理了一篇关于日期相关的类,希望可以帮助到大家. 正文 一.日期类介绍 在 Java 里面,操作日 ...