zoukankan      html  css  js  c++  java
  • 装饰器

    一、简单的模块

        import  time         跟时间有关

          time.time()    获取当前时间(从1970年1月1日到现在经过多少秒)

          time.sleep(2) 让程序执行到这个位置停2秒

        import os    跟程序有关

          os.remove(name)   删除这个文件

          os.rename(name,name1)  把name文件名改成name1

        import urllib   爬虫

          from urllib.request import urlopen     

    from urllib.request import urlopen
    def get_url():
        url = 'http://www.xiaohua100.cn/index.html'
        def get():
            ret = urlopen(url).read()
            s = print(ret)
            with open('file','r',encoding='utf-8') as f:
                f.read(s)
        return get
    get_func = get_url()
    get_func()

    二、装饰器

        装饰器的作用 :

          不想修改函数的调用方式,还想在原来的函数前后添加功能。

        原则:开放封闭原则

          开放:对扩展是开放的

          封闭:对修改是封闭的

        封版:函数不得修改,要修改提交申请并写出会有影响的内容。

        写一个装饰器函数,对一个函数执行时间进行计算:

    import time
    def timmer(f):       #装饰器函数
        def inner(*args,**kwargs):
            start = time.time()
            ret = f(*args,**kwargs)
            end = time.time()
            print(end - start)
            return ret
        return inner
    @timmer         # 语法糖 @装饰器函数名   一定在被装饰的函数上一行
    def func(s,a):      #被装饰的函数
        time.sleep(0.1)
        print('大家好',s,a)
    # func = timmer(func)
    func(1,a = 2)

    装饰器的基本格式:

    def wrapper(func):   #qqxing
        def inner(*args,**kwargs):
            ret = func(*args,**kwargs)   #被装饰的函数
            return ret
        return inner
    
    @wrapper        #qqxing = wrapper(qqxing)
    def qqxing():
        print(123)

    带参数的装饰器

      如果不用装饰器,不用删除语法糖,直接修改flag=False即可。

    import time
    flag = True
    def timmer_out(flag):
        def timmer(func):
            def inner(*args,**kwargs):
                if flag:
                    start = time.time()
                    ret = func(*args,**kwargs)
                    print(time.time() - start)
                else:
                    ret = func(*args,**kwargs)
                return ret
            return inner
        return timmer
    @timmer_out(flag)
    def func():
        time.sleep(0.1)
        print('aaaaa')
    func()

    一个函数有多个语法糖

    def wrapper1(func):
        def inner1():
            print('wrapper1 ,before func')
            ret = func()
            print('wrapper1 ,after func')
            return ret
        return inner1
    
    def wrapper2(func):
        def inner2():
            print('wrapper2 ,before func')
            ret = func()
            print('wrapper2 ,after func')
            return ret
        return inner2
    
    def wrapper3(func):
        def inner3():
            print('wrapper3 ,before func')
            ret = func()
            print('wrapper3 ,after func')
            return ret
        return inner3
    
    @wrapper3
    @wrapper2
    @wrapper1
    def f():
        print('in f')
        return '哈哈哈'
    
    print(f())

    结果:

    wrapper3 ,before func
    wrapper2 ,before func
    wrapper1 ,before func
    in f
    wrapper1 ,after func
    wrapper2 ,after func
    wrapper3 ,after func
    哈哈哈

  • 相关阅读:
    洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk( 普及-)
    洛谷 P1909 [NOIP2016 普及组] 买铅笔
    全排列问题
    集合的划分(setsub)
    自然数拆分-回溯
    洛谷 P4414 [COCI2006-2007#2] ABC
    洛谷 P5709 【深基2.习6】Apples Prologue
    洛谷 P4326 [COCI2006-2007#1] Herman
    平面分割
    洛谷 P1601 A+B Problem(高精)
  • 原文地址:https://www.cnblogs.com/tsboy/p/8135884.html
Copyright © 2011-2022 走看看