python学习笔记16-装饰器

装饰器(函数)

1.函数作用域

2.高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

3.闭包  闭包就是能够读取其他函数内部变量的函数。

在本质上,闭包是将函数内部和函数外部连接起来的桥梁
如果一个内部函数里,对在外部作用域(但不是全局作用域)的变量进行引用,那么内部函数被认为是闭包
closure
闭包-函数+定义函数时的环境
def outer():
    x=10
    def inner(): #inner就是内部函数
        print(x) #外部环境的一个变量
    return inner  #内部函数inner就是一个闭包函数

#以下可以取到inner
outer()()
#下面执行的时候 f()能取到x的值 就是因为inner时一个闭包函数
f=outer()  
f()

#inner()  不行 局部变量 全局无法使用

写代码的时候有一个开放封闭原则 

解决一些重复功能

import time

def foo():
    print('foo      ')
    time.sleep(2)

def bar():
    print('bar      ')
    time.sleep(3)

def show_time(f):
    start_time=time.time()
    f()
    end_time=time.time()
    time=end_time-start_time
    print(time)

 

装饰器:

import time

#装饰器函数
def show_time(f):
    def inner():
        start_time=time.time()
        f()
        end_time=time.time()
        ctime=end_time-start_time
        print(ctime)
    return inner

@show_time  等价于 foo=show_time(foo)
def foo():
    print('foo      ')
    time.sleep(2)

@show_time
def bar():
    print('bar      ')
    time.sleep(3)

    

 当被装饰的函数带有参数时:

#-*- coding:utf-8 -*-

import time

#装饰器函数
def show_time(f):
    def inner(x,y):
        start_time=time.time()
        f(x,y)
        end_time=time.time()
        stime=end_time-start_time
        print(stime)
    return inner

#等价于 foo=show_time(foo)
@show_time  
def add(x,y):
    print(x+y)
    time.sleep(3)
add(1,2)

对于可变长参数

#-*- coding:utf-8 -*-

import time

#装饰器函数
def show_time(f):
    def inner(*args,**kwargs):
        start_time=time.time()
        f(*args,**kwargs)
        end_time=time.time()
        stime=end_time-start_time
        print(stime)
    return inner

#等价于 foo=show_time(foo)
@show_time  
def add(*args,**kwargs):
    sum=0
    for i in args:
        sum+=i
    print(sum)
    time.sleep(3)

add(1,2,5)

当装饰函数需要参数以用来处理不同操作时  用于处理有些函数需要记录日志 而有些不需要

#-*- coding:utf-8 -*-

import time

#装饰器函数
def logger(flag=''):
    def show_time(f):
        def inner(*args,**kwargs):
            start_time=time.time()
            f(*args,**kwargs)
            end_time=time.time()
            stime=end_time-start_time
            print(stime)
            if flag=='true':
                print('true')
        return inner
    return show_time
#等价于 foo=show_time(foo)
@logger('true')
def add(*args,**kwargs):
    sum=0
    for i in args:
        sum+=i
    print(sum)
    time.sleep(3)

@logger()
def bar():
    print('11111')

add(1,2,5)
bar()

类装饰器

#给每个类打印一句话
def Decorator(obj):
    print("定义了一个装饰器函数")
    return obj

@Decorator          #相当于执行 School = Decorator(School)
class School():
    pass

 

posted on 2019-04-11 14:05  Zhw_forever  阅读(174)  评论(0编辑  收藏  举报