Python函数06/装饰器
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/装饰器的更多相关文章
- python——函数之装饰器
		1 问题 实际生活中,我们很难一次性就把一个函数代码写得完美无缺.当我们需要对以前的函数添加新功能时,我们应该怎么做? 2 问题解决思路 (1)可以直接修改原来的函数,在函数内直接修改.当我们对多个函 ... 
- python函数、装饰器、迭代器、生成器
		目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象: 函数是第一类对象,即函数可以当作数据传递 ... 
- Python 函数之装饰器
		1.函数 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ... 
- python函数闭包-装饰器-03
		可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ... 
- Python函数的装饰器修复技术(@wraps)
		@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ... 
- Python函数的装饰器修复技术(@wraps)
		@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ... 
- Python函数加工厂-装饰器
		引言: 函数和装饰器好比程序界的加工厂: 1.函数一般可用来加工一种或者多种数据类型的数据:字符串.数字.列表.字典等 举一个简单例子:已知半径求面积 def s(r): s = 3.14 * r * ... 
- Python函数的装饰器
		函数的装饰器. 1. 装饰器 开闭原则: 对功能的扩展开放 对代码的修改是封闭 通用装饰器语法: def wrapper(fn): def inner(*args, **kwargs): # 聚合 & ... 
- python 函数之装饰器,迭代器,生成器
		装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ... 
随机推荐
- @topcoder - SRM614D1L3@ TorusSailing
			目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 N*M 的方格图,某人从 (0, 0) 出发想要走到 ... 
- 为避免种族歧视,谷歌Chrome将不再使用“黑名单”等词
			GitHub 15.2k Star 的Java工程师成神之路,不来了解一下吗! GitHub 15.2k Star 的Java工程师成神之路,不来了解一下吗! 近日,美国黑人乔治‧佛洛伊德(Georg ... 
- vc++,MfC ,cstring与char相互转换知识
			//mapName = mapString;//----------------------原始- string mapName; CString strtemp,strtemp2; //char t ... 
- Redis系列(五):数据结构List双向链表中基本操作操作命令和源码解析
			1.介绍 List是通过ListNode实现的双向链表. 1.双端:获取某个结点的前驱和后继结点都是O(1) 2.无环:表头的prev指针和表尾的next指针都指向NULL,对链表的访问都是以NULL ... 
- Quaternion:通过API对Quaternion(四元数)类中的方法属性初步学习总结(二)
			1.RotateTowards方法 RotateTowards(From.rotation,To.rotation,fspeed) 个人理解:使From的rotation以floatspeed为速度, ... 
- mongodb   数据库  增删改查
			mongodb 数据库 增删改查 增: // 引入express 模块 var express = require('express'); // 路由var router = expr ... 
- Spring中的AOP(二)
			2.5 Spring的织入 在上一篇文章中,我们介绍了Pointcut.Advice.Advisor三个必要模块,剩下的工作就是把它们拼装起来,也就是织入过程.在Spring中,使用类org.spri ... 
- HTML&CSS面试高频考点(一)
			1. 行内元素/块级元素 非替换元素/替换元素 行内元素(内联元素):a, abbr(缩写), acronym(只取首字母缩写), b, bdo(文本方向), big, br, cite(引用), c ... 
- python实现从文件夹随机拷贝出指定数量文件到目标文件夹
			为了方便倒腾数据,功能如题,该脚本和操作目录在同一根目录 实际运行时要手动修改程序中:cpfile_rand('img', 'outfile', 10) # 操作目录,输出目录,输出数量 import ... 
- 老板急坏了,公司网站的 HTTPS 过期了
			端午出去玩的时候,老板打电话说公司网站的 HTTPS 过期了,访问不了(见下图),要我立马升级一下.可惜我当时没带电脑,无能为力,可把老板急坏了. 没办法,急就先急着,只能等我有电脑了才能搞.点击高级 ... 
