博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python装饰器
阅读量:5280 次
发布时间:2019-06-14

本文共 2496 字,大约阅读时间需要 8 分钟。

作用:不修改原来代码调用方式的情况下添加新功能

1、无参无返回值的被装饰函数

def funct():    time.sleep(1)    print('test')def timer(f): #timer就是一个装饰器函数    def inner():        start = time.time()        f()   # 被装饰的函数        end=time.time()        print(end-start)    return innerfunct=timer(funct)funct()

2、无参有返回值的被装饰函数

def timer1(f): #装饰器函数    def inner():        start = time.time()        res=f()   # 被装饰的函数        end=time.time()        print(end-start)        return res    return inner@timer1       def funct1(): # 被装饰函数    time.sleep(1)    print('test')    return 'Happy New Year'print(funct1())

3、有参有返回值的被装饰函数

1195605-20181106111647367-1837618038.png

4、多种参数的被装饰函数

1195605-20181106113515893-1941005858.png

装饰器进阶

1、获取被装饰函数信息

#from functools import wraps # 想要取得被装饰函数的信息可以引用改装饰器def wrapper(func):    #@wraps(func)    def inner(*args,**kwargs):        print('执行前')        ret = func(*args,**kwargs)        print('执行后')        return ret    return inner@wrapperdef holiday(day):    '''放假通知'''    print('全体放假%d天'%day)    return 'happy'print(holiday.__name__)print(holiday.__doc__)result= holiday(3)

2、启用和关闭装饰器

import time# FLAGE=TrueFLAGE=False# 最多包三层def timer_out(flag):    def timer(func):        def inner(*args,**kwargs):            if flag:                start=time.time()                ret= func(*args,**kwargs)                end=time.time()                print(end-start)                return ret            else:                ret=func(*args,**kwargs)                return ret        return inner    return timer@timer_out(FLAGE)  # @timer_out(FLAGE)=>@timer=>a=timer(a)def a():    time.sleep(0.1)    print('a')@timer_out(FLAGE)def b():    time.sleep(0.1)    print('b')a()b()

3、多个装饰器装饰同一个函数

def wrapper1(func): # func=>inner2    def inner1():        print('wrapper1,before func')        func()        print('wrapper1,after func')    return inner1def wrapper2(func): # func=>f    def inner2():        print('wrapper2,before func')        func()        print('wrapper2,after func')    return inner2# 先从离被装饰函数近的装饰器开始执行# 当执行到@wrapper1找不到被装饰函数@wrapper1  # f=wrapper1(inner2)=inner1@wrapper2  # f=wrapper2(f)=inner2def f():    print('in f')f() # =>inner1()

解析:

1195605-20181106155835973-1008087787.png

其他

生成器

# 只要是含有yield 关键字的函数都是生成器函数# 只能在函数内使用 不能与return共用# 生成器函数执行之后会得到一个生成器作为返回值# 生成器是个迭代器# def generator():  # 生成器函数#     print(1)#     yield 'a'# ret = generator() # 生成器# print(ret.__next__())def generator():     print(1)    yield 'a'    print(2)    yield 'b'ret = generator() # print(ret.__next__()) # 执行完就不在内存中了# print(ret.__next__())for i in ret:    print(i)# 列表是可迭代的 不是迭代器 当用for遍历它时会生成一个迭代器

转载于:https://www.cnblogs.com/hklol/p/9913989.html

你可能感兴趣的文章
QA系统Match-LSTM代码研读
查看>>
typedef与define宏定义用于声明新的类型之间的区别
查看>>
idea前后端分离搭建 JavaWeb项目
查看>>
python学习笔记 day44 mysql练习题(三)
查看>>
Extracting info from VCF files
查看>>
c# 使用ICSharpCode.SharpZipLib.dll实现文件压缩并返回
查看>>
【Laravel】 常用的artisan命令
查看>>
Qt 中获取本机IP地址
查看>>
基本数据类型(int, bool, str)
查看>>
070102_赌博设计:概率的基本概念,古典概型
查看>>
IT人生的价值和意义 感觉真的有了
查看>>
Linux命令之df
查看>>
BaseActivity--上门啦
查看>>
JS DOM对象
查看>>
python正则表达式
查看>>
OGR – Merging Multiple SHP files
查看>>
滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(10月17日~10月23日)...
查看>>
创业公司该不该被收购?(转)
查看>>
sqlserver 行转列、列转行[转]
查看>>
【IScroll深入学习】解决IScroll疑难杂症
查看>>