python进阶学习Day12

本文详细介绍了Python中的装饰器概念,作为可协作的对象,装饰器实质上是接收并返回函数的函数。通过示例展示了如何使用基础装饰器、带有参数的装饰器以及timeit用于性能测量的应用。
摘要由CSDN通过智能技术生成

装饰器decorator
在python中所有东西都是对象(object)
在python中定义一个函数时,我们只是新建了一个变量,在变量里保存了一个函数对象(function object)

def get_mutiply_func(x):
    def multoply(n):
        return n*x
    return  multoply#此处返回的是一个函数并将x传入

a=get_mutiply_func(3)
b=get_mutiply_func(2)

print(a(3))#结果为9
print(b(3))#结果为6

decorate本身是一个collable(接口),也可以把它看作一个函数,@后面跟的就是一个函数名
decorate本身是一个输入输出都是函数的函数,(输入一定是函数,极端条件下输出不一定是函数)

接着是一个最简单的装饰器应用

def dec(f):
    return 1

@dec
def double(x):
    return x*2

print(double)#返回1

double=dec(double)#这就是装饰器的作用
import time
def timeit(f):
    def wrapper(x):
        start=time.time()
        ret=f(x)
        print(time.time()-start)
        return ret
    return wrapper

@timeit
def my_func(x):#相当于my_func=timeit(my_func(x))
    time.sleep(x)

my_func(1)
import time

def timeit(f):
    def wrapper(x):
        start=time.time()
        ret=f(x)
        print(time.time()-start)
        return ret
    return wrapper

@timeit
def myfunc(x):
    time.sleep(x)

@timeit
def otherfunc(x):
    return x**2

print(otherfunc(2))#返回运行时间和4

可以传入多个参数的

import time
def timeit(f):
    def wrapper(*args,**kwargs):#装饰的是什么函数都能用
        start=time.time()
        ret=f(*args,**kwargs)
        print(time.time()-start)
        return ret
    return wrapper

@timeit
def my_func(x):
    time.sleep(x)

带参数的decorator

import time
def timeit(f):
    def wrapper(*args,**kwargs):#装饰的是什么函数都能用
        start=time.time()
        ret=f(*args,**kwargs)
        print(time.time()-start)
        return ret
    return wrapper

@timeit
def my_func(x):
    time.sleep(x)
@timeit(10)#它会先计算timeit(10),返回的是一个函数,这个函数再去调用double,再返回一个函数,相当于先返回一个decorator(也就是timeit(10)),再用这个返回的装饰器再去进行一次装饰器调用
def double_func(x):#等价于double_func=timeit(10)(double_func)
    #也等价于inner=timeit(10)    double_func=timeit(inner(double_fune))
    return x**2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值