【python基础】装饰器的使用

特点:

  1. 函数A作为参数出现,函数B接收函数A作为参数;
  2. 要有闭包的特点。
def test(): #声明函数
    print('===========test============')

t = test 
t()  #把函数赋值给t

输出:

===========test============

闭包:

def func(number):
    a = 100

    def inner_func():
        nonlocal a 
        nonlocal number
        number += 1
        for i in range(number):
            a += 1

        print(a)

    return inner_func

f = func(5)
f()

输出: 106

def test(): #声明函数
    print('===========test============')

t = test 
t()  #把函数赋值给t


def func(f):
    print(f)
    f()
    print('rrrrrr')

func(test)

输出:

<function test at 0x000002A934B42048>
===========test============
rrrrrr
  1. house是被装饰函数
  2. 将被装饰函数作为参数传给装饰器
  3. 执行装饰器函数
  4. 将返回值赋值给被装饰函数
def decorate(func):

    def wrapper():
        func()
        print('刷漆')
        print('装门')

    return wrapper
 
@decorate
def house():
    print('我是毛坯房')

house()
我是毛坯房
刷漆
装门

示例:

import time 

def decorate(func):
    def wrapper():
        print('正在校验')
        time.sleep(2) # 休眠2秒
        print('校验完毕')
        func()

    return wrapper
@decorate
def f1():
    print('=======f1')

f1()

输出:

正在校验
校验完毕
=======f1

注意区别,传参数:

import time 

def decorate(func):
    def wrapper(x):
        print('正在校验')
        time.sleep(2) # 休眠2秒
        print('校验完毕')
        func(x)  # 执行原函数,即f1()

    return wrapper
@decorate
def f1(n):
    print('=======',n)

f1(5)
import time 

def decorate(func):
    def wrapper(*args,**kwargs): # 参数个数不确定的时候用*args,字典时用**kwargs
        print('正在校验')
        time.sleep(2) # 休眠2秒
        print('校验完毕')
        func(*args,**kwargs)  # 执行原函数,即f1()

    return wrapper
@decorate
def f1(n):
    print('=======',n)

@decorate
def f2(name):
    print('=======',name)

f1(5)
f2('lily')

输出结果

正在校验
校验完毕
======= 5
正在校验
校验完毕
======= lily

如果装饰器是多层的,先装离得近的:
在这里插入图片描述

装饰器带参数:

def outer(a):  # 接收装饰器的参数
    def decorate(func): # 接收函数
        def wrapper(*args,**kwargs): # 接收函数的参数
            
            func(*args,**kwargs)  
            print('铺地砖{}'.format(a))

        return wrapper# 返回出第三层
    return decorate# 返回出第二层

@outer(10)
def house(time):
    print('我{}拿到了房子'.format(time))

house('2020')

输出:

2020拿到了房子
铺地砖10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值