装饰器的简单理解

# * coding:utf-8 *
'''
Name : 装饰器
Author : Lyy丶
Contect: 2569467296@qq.com
Date : 2019/2/19 0019
Time : 上午 10:18
Rember:人最重要的是自律和满足。
Desc:
'''


# 装饰器是一个非常有用的功能,在很多场合都可以使用。
# -·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·&
# 1.基本使用
def do_something():
    for i in range(1000000):
        pass
    print("play game")


do_something()
# >>>play game

# -·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·&
# 2.不是装饰器的装饰器(统计函数的执行时间)
import time


def decorator(fun):
    start = time.time()
    fun()
    runtime = time.time() - start
    print(runtime)


def do_something():
    for i in range(1000000):
        pass
    print("play game")


decorator(do_something)
# >>>play game
# >>>0.023001670837402344

# 这种实现看上去还可以,但是每次调用的是decorator,还要把函数作为一个参数传入,使用起来就不方便了。

# -·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·&
# 3.最简单的装饰器
import time


def decorator(fun):
    def wrapper():
        start = time.time()
        fun()
        runtime = time.time() - start
        print(runtime)

    return wrapper


@decorator
def do_something():
    for i in range(1000000):
        pass
    print("play game")


do_something()
# >>>play game
# >>>0.02500152587890625

# 装饰器是在函数定义时前面加@,然后跟装饰器的实现函数。装饰器的内部使用了闭包。

# -·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·&
# 4.目标函数带固定参数的装饰器
import time


def decorator(fun):
    def wrapper(name):
        start = time.time()
        fun(name)
        runtime = time.time() - start
        print(runtime)

    return wrapper


@decorator
def do_something(name):
    for i in range(1000000):
        pass
    print("play game" + " " + name)


do_something("dianjixiaozi")
# >>>play game dianjixiaozi
# >>>0.024001121520996094

# 实现很简单,就是给wrapper函数加相同的参数

# -·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·&
# 5.目标函数带不固定参数的装饰器
import time


def decorator(fun):
    def wrapper(*args, **kwargs):
        start = time.time()
        fun(*args, **kwargs)
        runtime = time.time() - start
        print(runtime)

    return wrapper


@decorator
def do_something(user, name):
    for i in range(1000000):
        pass
    print(user + " " + "play game" + " " + name)


do_something("cc1", "dianjixiaozi")
do_something("cc2", "xiaozhupeiqi")


# >>>cc1 play game dianjixiaozi
# >>>0.023001432418823242
# >>>cc2 play game xiaozhupeiqi
# >>>0.026001691818237305

# -·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·&
# 5.目标函数带不固定参数的装饰器
import time
def decorator(max):
    def _decorator(fun):
        def wrapper(*args, **kwargs):
            start = time.time()
            for i in range(max):
                fun(*args, **kwargs)
            runtime = time.time() - start
            print(runtime)
        return wrapper
    return _decorator


@decorator(2)
def do_something(name):
    for i in range(1000000):
        pass
    print("play name" + " " + name )


do_something("dianjixiaozi")
# >>>play name dianjixiaozi
# >>>play name dianjixiaozi
# >>>0.047002553939819336
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值