# * 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
装饰器的简单理解
最新推荐文章于 2021-12-31 11:16:14 发布