python----装饰器

一、闭包函数

定义:

1.函数是一个内部函数

2.内部函数使用了外部的一个变量(非全局变量)

def outer():
    x=10
    def inner():     # 内部函数
        print(x+10)  #内部函数使用了外部函数的一个变量,所以inner就是闭包函数
    return inner()

outer()

二、装饰器

作用:在不改变原函数的基础上,给原函数加功能

调用方式: @装饰器名

1.简单装饰器

def anaything(n):
    def inner():     # 装饰器首先是一个闭包函数
        n()
        print('13')  # 在这里,装饰器的作用是打印13
    return inner()

@anaything       # anaything(a)
def a():
    print('aaa')

# 输出:  aaa
#         13

在这里,@anaything 就相当于anaything(a),两者是相同的

2.   带参数的装饰器

import time

def count_time(func):
    def inner(a,b):
        start_time = time.time()
        func(a, b)
        end_time = time.time()
        print('总共用时 %s' % (end_time - start_time))
    return inner

@count_time
def add(a,b):
    print(a * b)
    time.sleep(2)

add(5,8)
# 输出: 40
#       总共用时 2.0055623054504395

3.多层装饰器

import time

def show_time(func):   # 计算程序执行时间
    def inner(a,b):
        start_time = time.time()
        time.sleep(2)
        func(a,b)
        end_time = time.time()
        print('花费了 %s' % (end_time - start_time))
    return inner

def count(func):    # 用来打印3333
    def inner(a,b):
        print('3333')
        func(a,b)
    return inner

@show_time
@count
def add(a,b):
    print(a * b)
    time.sleep(2)

add(3,5)
# 输出: 3333
#        15
#        花费了 4.010709047317505

注:在程序执行过程当中,没有顺序,同时进行

4.类装饰器

import time

class show_time():
    def __init__(self,func):   # __init__,面向对象中初始化方法
        self.func = func

    def __call__(self,a,b):    # __call__,面向对象中可调用方法
        start_time = time.time()
        self.func(a,b)
        time.sleep(2)
        end_time = time.time()
        print('总计用时: %s' % (end_time - start_time))

@show_time
def add(a,b):
    time.sleep(2)
    print(a * b)

add(5,8)
# 输出: 40
#        总计用时: 4.008551359176636

你可能感兴趣的:(python基础,python,开发语言,后端)