python装饰器学习

装饰器的介绍

(1)装饰器的本质:闭包函数
(2)装饰器的作用:在不改变原函数的调用方式情况下,给原函数增加其他功能。
(3)开发原则:开放封闭原则。
(4)语法:@+装饰器函数名

闭包

闭包函数:嵌套函数,内部函数调用外部函数的变量。

def outer(arg1):
    def inner():
        print(arg1)
    return inner

if __name__=="__main__":
    func=outer(1)
    func()

装饰器

开放封闭原则:①对功能扩展是开放的②对原函数的调用方法是封闭的,即对修改是封闭的。
(1)装饰不带参数的函数

import time
def timer(func):
    def inner():
        start=time.time()
        func()
        end=time.time()
        print(end-start)
    return inner

@timer
def func():
    time.sleep(3)

if __name__=="__main__":
    func()

(2)装饰带参数的函数。

def adder(func):
    def inner(*args,**kwargs):
        func(*args,**kwargs)
        print("两数之和:",args[0]+args[1])
    return inner

@adder
def func(arg1,arg2):
    print("两数之差:",arg1-arg2)
    
if __name__=="__main__":
    func(2, 1)

(3)带参数的装饰器

import time
FLAG=True
def outer(FLAG):
    def timer(func):
        def inner():
            if FLAG:
                start=time.time()
                func()
                end=time.time()
                print(end-start)
            else:
                func()
        return inner
    return timer

@outer(FLAG)
def func():
    time.sleep(3)
    print("123")

if __name__=="__main__":
    func()

(4)多个装饰器装饰一个函数

import time
def timer(func):
    def inner(*args, **kwargs):
        start=time.time()
        func(*args, **kwargs)
        end=time.time()
        print(end-start)
    return inner

def adder(func):
    def inner(*args, **kwargs):
        func(*args, **kwargs)
        print("两数之和:", args[0] + args[1])

    return inner

@timer
@adder
def func(arg1, arg2):
    time.sleep(2)
    print("两数之差:", arg1 - arg2)

if __name__ == "__main__":
    func(2, 1)

(5) 特殊装饰器(wraps)

from functools import wraps
import time
def timer(func):
	@wraps(func)
    def inner():
        start=time.time()
        func()
        end=time.time()
        print(end-start)
    return inner

@timer
def func():
    time.sleep(3)

if __name__=="__main__":
    func()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值