国产成人AV无码一二三区,少女1到100集,国产精品久久久久精品综合紧,巜公妇之诱感肉欲HD在线播放

文章 > Python常见问题 > python装饰器如何实现

python装饰器如何实现

装饰器

头像

silencement

2019-11-12 14:50:282847浏览 · 0收藏 · 0评论

1、装饰器的理解

装饰器是将一个函数镶嵌在另一个函数中进行重复使用的目的,不改变其结构,增加函数的使用方式,但是不用写过多冗余的代码;

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

通常用到的功能:1.引入日志;2.函数执行时间统计;3.执行函数前预备处理;4.执行函数后清理功能;5.权限校验;6.缓存

2、实现原理与通用写法

咱们可以从一个简单的记录函数运行时间的简单装饰器,举一反三,推导出一个通用的装饰器写法

import time
 
def timer(func):
    '''
    记录方法运行时间的装饰器
    :param func: 方法
    :return:函数对象
    '''
    def deco(*args, **kwargs):
        startTime = time.time()
        f = func(*args, **kwargs)
        endTime = time.time()
        msecs = (endTime - startTime) * 1000
        print("time is %d ms" % msecs)
        return f # 如果 func 有返回值得话,需要在此return回去,否则,默认返回值为 None,一般默认都返回
 
    return deco
 
 
@timer
def test(parameter):
    print("test is running!")
    time.sleep(1)
    return "Returned value" # 该函数有返回值,所以需要在 装饰器中的 deco 方法中 写返回值
 
 
t = test('aa')
print(t)

python学习网,免费的python学习网站,欢迎在线学习!

这是一个很简单的通用的记录时间的装饰器,从而推导出一个通用的装饰器写法:

def func_name(func): # 自定义装饰器函数名
    def deco(*args, **kwargs): # 将所有参数原封不动的进行传递
        print("在这个分割线之上写函数运行前的操作")
#         -----------分割线-----------
        f = func(*args, **kwargs)
#         -----------分割线-----------
        print("在这个分割线之后,return之前,写函数运行后的操作")
        return f # 如果 func 有返回值得话,需要在此return回去,否则,默认返回值为 None,一般默认都返回
 
    return deco
 
 
@func_name
def test(parameter):  # 8
    print("test is running!")
    time.sleep(1)
    return "Returned value" # 该函数有返回值,所以需要在 装饰器中的 deco 方法中 写返回值
 
 
t = test('aa')
print(t)

ok 装饰器到此可以完事了,一般情况下都能满足需求了,网上看那么多原理,有点儿浪费时间,我偏向实操型,实在不喜欢啰嗦那么多,就是干。

当然在开发过程中, 我们可能会遇到一些特殊情况,比如参数问题

1、给装饰器函数代参数(通用)

2、将执行函数的参数拆分计算等(比如:1000w的数据,拆分成100份执行等)(定制)

那就按顺序来

1、写一个代参数的装饰器

def logging(level):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print("[{level}]: enter function {func}()".format(level=level, func=func.__name__))
            return func(*args, **kwargs)
        return inner_wrapper
    return wrapper
 
@logging(level='INFO')
def say(something):
    print("say {}!".format(something))
 
# 如果没有使用@语法,等同于
# say = logging(level='INFO')(say)
 
@logging(level='DEBUG')
def do(something):
    print("do {}...".format(something))
 
if __name__ == '__main__':
    say('hello')
    do("my work")
关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

老赵抱着陈婷的乳在厨房里视频| 台湾《洞门为君开》演员表| 苍老师最经典10部电影| 妈妈的朋友2| 15岁初中生免费观看| 美女打屁股| 《老公今晚我加班》日剧| 老汉猛躁女人XXXXX88AV| 同学的母亲中字ID| WW.77.GOVCN| 初次尝了销魂少妇邻居| 苏畅| 挤公交忘穿内裤被挺进| 《诱人的护士》苍井空-| 免费观看已满十八岁电视剧国外| 色翁荡熄第10章| 《蜜桃成熟时》无删减版| 无人区免费观看高清电视剧| 拔小萝卜免费观看全集电视剧| 美月| 《完美邻居》电影免要观看| 台球室的特殊待遇2HD| 高H文| 韩国电影片| 《女仆教育》动漫第一季| 吻戏刺激| 汗汗画画免费阅读在线阅读| 厨房韵母2| 楼梯间的秘密小说BY赵景明| 赵局长含着小婷的双乳| 巨乳美女| 《瞒着丈夫说在公司加班》中字| 妈妈的职业4免费观看完整版高清| 第1章饱满的乳峰喷奶水动漫| 王叔我老公还在客厅呢什么小说| 扒开腿让我躁你很舒服的导演是谁| 妈妈がだけの心に漂う| 老公把闺蜜干的嗷嗷叫| 《法国空乘4》在线观看| 蘑菇花园H5部分阅读目录大全| 国产一区