#!/usr/bin/env python

# -*- coding:utf-8 -*-

# author: Changhua Gong

import time, functools

'''

实现装饰器:

1.函数即变量;

2.高阶函数;

1)把一个函数名当做实参传给另一个函数(在不修改被装饰函数的源代码情况下为其添加功能);

2)返回值中,包含函数名(不修改函数的调用方试)。

3.嵌套函数(在一个函数中,用def去声明另一个函数)。

原则:

1.不能修改被装饰的函数的源代码;

2.不能修改被装饰的函数的调用方试。

补:

1.函数在调用前,只要其涉及到的变量均在调用前别解释完全(无论先后顺序)

即可顺利执行。

'''

def timmer(func):

# @functools.wraps(func)  #加上这个装饰后test的函数名就不是wrapper了,而是test,注意位置(http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000)

def wrapper(*args, **kv):

time_b = time.time()

return (func(*args, **kv))

time_e = time.time()

print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))

return wrapper  # 注意这个return的位置

# 写在装饰的函数的前面,装饰多个函数,每个函数前面需加上@decorator

@timmer  # test = timmer(test) = wrapper, 调用时test() = wrapper(),这里说明参数的传输问题

# test(*args,**kv) = wrapper(*args,**kv)

def test():

print("Function test begins running.")

time.sleep(0.2)

print("Function test ends running.")

return "测试"

print("通过2层装饰器函数名更替为:%s" % test.__name__)

print(test())

print("-----------------------------------------")

def timmer(func):

#@functools.wraps(func)

def wrapper(*args, **kv):

time_b = time.time()

print("Begin calling.")

rs = func(*args, **kv)  # 将函数返回值赋给rs

print("End calling.")

return rs  # 这里返回函数执行完后的返回值

time_e = time.time()

print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))

return wrapper  # 注意这个return的位置

# 写在装饰的函数的前面,装饰多个函数,每个函数前面需加上@decorator

@timmer  # test = timmer(test) = wrapper, 调用时test() = wrapper(),这里说明参数的传输问题

# test(*args,**kv) = wrapper(*args,**kv)

def test():

print("Function test begins running.")

time.sleep(0.2)

print("Function test ends running.")

return "测试"

print("通过2层装饰器函数名更替为:%s" % test.__name__)

print(test())

print("-----------------------------------------")

'''

上述装饰器都是简单的两层。

如果装饰器本身需要传入参数,则需要3层(应用场景如:登录网页使用微信、QQ、还是邮箱)。

'''

def login(login_type):

def timmer(func):

#@functools.wraps(func)

def wrapper(*args, **kv):

time_b = time.time()

if login_type == "QQ":

print("Login by QQ.")

return (func(*args, **kv))

else:

print("Login by Others.")

return (func(*args, **kv))

time_e = time.time()

print("Function %s runned for %ss" % (func.__name__, (time_e - time_b)))

return wrapper  # 注意这个return的位置

return timmer # 注意这个return的位置

# 写在装饰的函数的前面,装饰多个函数,每个函数前面需加上@decorator

@login("QQ")  # test = timmer(test) = wrapper, 调用时test() = wrapper(),这里说明参数的传输问题

# test(*args,**kv) = wrapper(*args,**kv)

def test():

print("Function test begins running.")

time.sleep(0.2)

print("Function test ends running.")

return "测试"

print("通过3层装饰器函数名更替为:%s" % test.__name__)

print(test())

python三层装饰器-python 3层装饰器及应用场景相关推荐

  1. Python函数的装饰器,两层装饰器和三层装饰器

    一.装饰器 1.函数装饰圈的定义 函数装饰器:一种装饰函数的函数 2.个人理解两层函数装饰器 两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头尾进行添加程序,但是 ...

  2. python3层装饰器_python三层装饰器python字符串,数值计算

    Python是一种面向对象的语言,但它不像C++一样把标准类都封装到库中,而是进行了进一步的封装,语言本身就集成一些类和函数,比如print,list,dict etc. 给编程带来很大的便捷 Pyt ...

  3. python装饰器两层和三层区别_学习python的第十五天(函数的装饰器,两层装饰器和三层装饰器)...

    06.01自我总结 一.装饰器 1.函数装饰圈的定义 函数装饰器:一种装饰函数的函数 2.个人理解两层函数装饰器 两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头 ...

  4. python三层装饰器-python三大神器===》装饰器

    1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大"神器'(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内 ...

  5. python三层装饰器-Python自动化开发学习4-装饰器

    装饰器 通过装饰器可以为函数添加附加功能.通过修改函数本身也可以实现增加功能,但是通过装饰器还有下面2个好处.装饰器的2个原则:不改变被装饰函数的源代码 不改变被装饰函数的调用方式 遵循了上面2个原则 ...

  6. python三层装饰器-python3装饰器

    python装饰器 预备知识 首先我们要知道在python,一切皆对象,函数也是一个对象 >>> def test(): ... return "Hello World&q ...

  7. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

  8. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景

    装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...

  9. python装饰器-Python——装饰器(Decorator)

    1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...

最新文章

  1. Leetcode | Binary Tree Maximum Path Sum
  2. 2020秋季-人工神经网络课程报告
  3. yota3墨水屏设置_国产墨水屏“手写平板”评测,10.3英寸大屏,支持无纸化办公...
  4. BCB key事件中判断Shift、Alt、Ctrl状态
  5. 分子排列不同会导致_生物信息遇上Deep learning(7): ReLeaSE--强化学习做药物分子设计...
  6. 【测试点2分析】:1020 月饼 (25分)(甲级 1070 Mooncake (25 分))
  7. 线性代数及其应用_线性代数入门——行列式的简单应用选讲
  8. 数组 边界 检查的几种实现方法
  9. 值得收藏!UI设计学习借鉴常用网站
  10. 重新认识一遍JavaScript - 2
  11. Java基础语法之变量作用域、小大驼峰命名规则和java运算符(赋值、关系、三元、逻辑运算符)
  12. CVPR2022 | 移动端手部三维重建
  13. 数字图像处理_05_(图像锐化与边缘检测——Premittt算子、Roberts算子、Sobel算子、Scharr算子、Laplacian算子、LoG算子、Canny算子)
  14. read.html5.qq.com,从QQ浏览器缓存文件中提取出完整的视频
  15. 计算机检索的主要方法,计算机检索主要途径和方法
  16. 2022年要知悉的9大互联网前沿科技
  17. 【Redis笔记】缓存穿透与缓存击穿以及应对方法
  18. qtablewidget翻页禁止_PyQt—QTableWidget实现翻页功能
  19. C#实现批量生成条形码 ——主要用于准考证号的条形码生成
  20. 使用Dubbo实现简单的RPC调用(Spring配置文件版)

热门文章

  1. ubuntu 12.04lts 安装insight6.8a
  2. MapInfo常见数据格式
  3. WriteStrToReg() ReadStrFormReg()
  4. 计算机网络——互动百科
  5. 【职业规划和代码库设计】
  6. 【Linux】安装配置Tomcat7
  7. linux开启FTP以及添加用户配置权限,只允许访问自身目录,不能跳转根目录
  8. ASP.NET Core MVC – Caching Tag Helpers
  9. Mac版 Android Studio Android Sdk 更新方式
  10. sql server image字段的转换