Python装饰器教程展示了如何在Python中使用装饰器基本功能。
文章目录
- 1 使用教程
- 1.1 Python装饰器简单示例
- 1.2 带@符号的Python装饰器
- 1.3 用参数修饰函数
- 1.4 Python装饰器修改数据
- 1.5 Python多层装饰器
- 1.6 Python装饰器计时示例
- 2 参考
1 使用教程
Python函数是一等公民。这意味着函数与Python中的其他对象具有同等的状态。可以将函数分配给变量,存储在集合中,动态创建和删除或作为参数传递。嵌套函数也称为内部函数,指的是在另一个函数中定义的函数。
Python decorator扩展并修改可调用函数的行为,而不修改可调用函数本身。decorator是修饰(或包装)其他函数并在包装函数运行前后执行代码的函数。Python装饰器通常用于日志记录,身份验证和授权,计时和缓存中。
1.1 Python装饰器简单示例
在这个示例中,简单创建一个简单的装饰器示例。
# 以函数作为参数
def enclose(fun):
# wrapper*()用星好装饰传递过来的函数,将返回包装函数。
def wrapper():
print("***************************")
fun()
print("***************************")
# 返回包装函数
return wrapper
# 这是要装饰的常规函数
def myfun():
print("myfun")
# enclose()函数是类似decorator,它通过在输出中添加星形符号来扩展myfun函数的输出。
# myfun被传递给enclosure()函数,在该函数中对其进行了扩展。将返回并调用包装函数。
enc = enclose(myfun)
# 调用包装函数
enc()
***************************
myfun
***************************
1.2 带@符号的Python装饰器
Python允许使用@符号来标记要用decorator装饰的方法。从功能上讲,该示例与上一个示例相同。仅使用不同的语法。
def enclose(fun):
def wrapper():
print("***************************")
fun()
print("***************************")
return wrapper
# @enclose 就是enc = enclose(myfun)简写
# 表明调用enclose函数修饰myufun函数,并返回修饰函数
@enclose
def myfun():
print("myfun")
myfun()
***************************
myfun
***************************
1.3 用参数修饰函数
下面的示例演示如何装饰带有参数的函数。
def enclose(fun):
def wrapper(val):
print("***************************")
fun(val)
print("***************************")
return wrapper
@enclose
def myfun(val):
print(f"myfun with {val}")
myfun('falcon')
***************************
myfun with falcon
***************************
以下例子展示了如何使用*args,**kwargs语法处理可变数量的参数。
def enclose(fun):
def wrapper(*args, **kwargs):
print("***************************")
fun(*args, **kwargs)
print("***************************")
return wrapper
@enclose
def myfun(name, age):
print(f'{name} is {age} years old')
myfun(name='Peter', age=32)
myfun('Roman', 29)
***************************
Peter is 32 years old
***************************
***************************
Roman is 29 years old
***************************
1.4 Python装饰器修改数据
decorator函数可以修改修饰函数的数据。
def uppercase(fun):
# 在包装函数内部,修改并返回了文本
def wrapper():
res = fun()
modified = res.upper()
return modified
return wrapper
# @uppercase decorator将返回的文本更改为大写
@uppercase
def gen_message():
return 'Hello there!'
msg = gen_message()
print(msg)
HELLO THERE!
1.5 Python多层装饰器
可以在一个函数上应用多个装饰器。以下示例在文本上应用了两个HTML标签。
def strong(fun):
def wrapper():
return f'<strong>{fun()}</strong>'
return wrapper
def em(fun):
def wrapper():
return f'<em>{fun()}</em>'
return wrapper
# 先调用em装饰器,再调用strong装饰器
@strong
@em
def message():
return 'This is some message'
print(message())
<strong><em>This is some message</em></strong>
1.6 Python装饰器计时示例
在下面的示例中,我们在函数上应用计时器装饰器。下面示例使用decorator计算factoria()函数运行的时间。
import time
import math
def timer(func):
def wrapper(*args, **kwargs):
# 在函数运行之前,我们获得了开始时间。
begin = time.time()
f = func(*args, **kwargs)
# 获得结束时间
end = time.time()
print("Total time taken in : ", func.__name__, end - begin)
return f
return wrapper
@timer
def factorial(num):
return math.factorial(num)
f = factorial(4580)
Total time taken in : factorial 0.0005843639373779297
2 参考