最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • python装饰器如何实现

    正文概述    2020-10-16   262

    python装饰器如何实现

    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")

    起源地下载网 » python装饰器如何实现

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元