装饰器

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

原则: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. New Game! (最短路+建图)

    New Game! https://www.nowcoder.com/acm/contest/201/L 题目描述 Eagle Jump公司正在开发一款新的游戏.Hifumi Takimoto作为其中 ...

  2. 【校招面试 之 C/C++】第1题 为什么优先使用构造函数的初始化列表

    1.首先看一个例子: #include<iostream> using namespace std; class Test1 { public: Test1() // 无参构造函数 { c ...

  3. 使用maven管理引入jdk1.8

    需要在配置文件settings.xml中加入: <profile> <id>jdk-1.8</id> <activation> <activeBy ...

  4. idea 注释文件和方法注释

    类注释: 如下图所示

  5. QTextCodec 类

    https://blog.csdn.net/qq_23948025/article/details/45500637

  6. DB2错误码

    SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 + 未限定的列名被解释为一个有相互联系的引用 + 动态SQL语句用分号结束 + 没有找到满足SQL语句的行 + 用DATA CAPTUR ...

  7. html5移动开发。

    禁止滚动 $('#idl').bind("touchmove",function(e){ e.preventDefault(); }); 图片居中 (因为图片比较特别,所以需要在外 ...

  8. crontab误删除

    命令如下: cat /var/log/cron* | grep -i "`which cron`" > ./all_temp cat ./all_temp | grep -v ...

  9. 解决启动nginx时报80端口被占用的问题

    如何解决启动nginx时报80端口被占用 最近公司的的一个服务器上需要部署多个项目,但80端口只有一个,所有只有使用Nginx来代理,当访问域名时就可以自动 转到IP:端口号,而不需要在域名后面加端口 ...

  10. gj2 python中一切皆对象

    2.1 python中一切皆是对象 动态语言和静态语言的区别,Python的面向对象更彻底 同时动态语言,代码的灵活性高 没有编译(检查)的过程,错误只有在运行起来后才会发现 函数和类也是对象,属于p ...