装饰器

定义:本质是函数.(装饰其他函数)就是为其他函数添加附加功能

原则:1.不能修改被装饰的函数的源代码

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

理解装饰器前提条件:

1.函数即"变量"

2.高阶函数

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

  b.返回值中包含函数名(不修改函数的调用方式)

3.嵌套函数

 import time

 ################################### 高阶函数 ################################################################

 '''
高阶函数
'''
#普通函数
def foo():
#阻塞两秒
time.sleep(2)
print("this is foo")
#高阶函数
def bar(func):
start_time = time.time()
func()
end_time = time.time()
print("this is func time %s"%(end_time - start_time))
return func
#初始调用foo函数的方式
# foo()
#经过高阶函数调用foo函数的方式
foo = bar(foo)
foo() ################################### 嵌套函数 ################################################################ '''
嵌套函数
'''
def bar():
start_time = time.time()
def foo():
# 阻塞两秒
time.sleep(2)
print("this is foo")
#调用普通函数
foo()
end_time = time.time()
print("this is func time %s" % (end_time - start_time)) #调用嵌套函数
bar() ################################### 简易版装饰器 ################################################################ '''
高阶函数 + 嵌套函数 => 装饰器
'''
#简易版装饰器---函数不可传入参数
def bar(func):
def inner():
start_time = time.time()
func()
end_time = time.time()
print("this is func time %s" % (end_time - start_time))
return inner #普通函数
@bar
def foo():
# 阻塞两秒
time.sleep(2)
print("this is foo") #普通调用方式
foo() ################################### 升级版装饰器 ################################################################ #升级版装饰器---函数可以传入参数
def bar(func):
def inner(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs)
end_time = time.time()
print("this is func time %s" % (end_time - start_time))
return inner #普通函数
@bar
def foo(name,age):
# 阻塞两秒
time.sleep(2)
print(" %s this is foo %s"%(name,age)) @bar
def deco():
# 阻塞两秒
time.sleep(2)
print(" this is deco ") #普通调用方式
deco()
foo('zhangsan',22) ################################### 高级版装饰器 ################################################################ #高级版装饰器---装饰器与函数都可以传入参数,函数装饰内容可以根据装饰器参数做判断
#应用场景---在做用户验证时可以使用不同的验证手段,如本地验证,数据库验证,网络验证
def decorator(bath_type):
def bar(func):
def inner(*args,**kwargs):
if bath_type == 'fooname':
start_time = time.time()
func(*args,**kwargs)
end_time = time.time()
print("this is fooname time %s" % (end_time - start_time))
elif bath_type == 'deconame':
start_time = time.time()
func(*args, **kwargs)
end_time = time.time()
print("this is deconame time %s" % (end_time - start_time))
return inner
return bar #普通函数
@decorator(bath_type='fooname')
def foo(name,age):
# 阻塞两秒
time.sleep(2)
print(" %s this is foo %s"%(name,age)) @decorator(bath_type='deconame')
def deco():
# 阻塞两秒
time.sleep(2)
print(" this is deco ") #普通调用方式
deco()
foo('zhangsan',22)

Python3------装饰器详解的更多相关文章

  1. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  2. python3 装饰器全解

    本章结构: 1.理解装饰器的前提准备 2.装饰器:无参/带参的被装饰函数,无参/带参的装饰函数 3.装饰器的缺点 4.python3的内置装饰器 5.本文参考 理解装饰器的前提:1.所有东西都是对象( ...

  3. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  4. python之装饰器详解

    这几天翻看python语法,看到装饰器这里着实卡了一阵,最初认为也就是个函数指针的用法,但仔细研究后发现,不止这么简单. 首先很多资料将装饰器定义为AOP的范畴,也就是Aspect Oriented ...

  5. Python中的各种装饰器详解

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  6. 闭包&装饰器详解

    闭包 先不着急看闭包的定义,让我们从一段示例代码开始.如果将上一个示例稍微修改下: >>> def outer(): ... x = 1 ... def inner(): ... p ...

  7. python装饰器1:函数装饰器详解

    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...

  8. Python—装饰器详解

    装饰器:(语法糖) 本质是函数,它是赋予函数新功能,但是不改变函数的源代码及调用方式   原则: 1.不能修改被装饰函数的源代码 2.不能修改被装饰函数的调用方式 3.函数的返回值也不变 这两点简而言 ...

  9. python 叠加装饰器详解

    def out1(func1): #7.func1=in2的内存地址,就是in2 print('out1') def in1(): #8.调用函数index() 因为函数在in1里,所以首先运行in1 ...

  10. Python全栈开发之8、装饰器详解

    一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了.转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5486253.html 一.装饰器 装饰器可以使函数执 ...

随机推荐

  1. 第五章 二叉树(e5)重构

  2. [ERROR] Failed to contact master at [localhost:11311]. Retrying...

    [ERROR] [1446531999.044935824]: [registerPublisher] Failed to contact master at [localhost:11311]. R ...

  3. linux整合apache、php、mysql

    1.打开apache配置文件,添加AddType.找到DirectoryIndex并添加index.php AddType application/x-httpd-php .php AddType a ...

  4. Apache虚拟主机/端口多开

    Apache就是强大啊,简单配置一下就可以再开启另一个端口的web服务. 笔者最近使用XAMPP架设php服务端.有一些特别的需求:同样的代码,需要开始不同的端口, 协议类型提供web服务给客户端(h ...

  5. cookies,sessionStorage 和 localStorage 的区别

    请描述一下 cookies,sessionStorage 和 localStorage 的区别? sessionStorage 和 localStorage 是HTML5 Web Storage AP ...

  6. restful发布服务

    概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着不断获取资源的表示方式,客户端应用 ...

  7. 都是假的!这位小姐姐 P 的图,认真看你就输了!

    开门见山,先来看张图: 肯定有不少小伙伴用不屑的语气说,嗬!一看就是 P 的! 是的,任谁都能一眼看出来是假的.但你可能想象不到,这张图的原始素材是有多么……支离破碎,熊是动物园里的,小孩是在家门口站 ...

  8. Vue.js 登录注册实现

    转载 http://www.jb51.net/article/118003.htm

  9. 原生JS 实现元素排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Java 中>>和>>>的区别

    Java 中>>和>>>的区别 Java中的位运算符: >>表示右移,如果该数为正,则高位补0,若为负数,则高位补1: >>>表示无符号右移 ...