装饰器

一、简单的模块

    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
哈哈哈

原文地址:https://www.cnblogs.com/tsboy/p/8135884.html