前言
在Python代码中经常会看到
@
符号,它的作用如何,引起了我的兴趣,把理解整理一下
概念解释
- 什么是高阶函数
把函数名当做参数传给另外一个函数,在另外一个函数中通过参数调用执行
- 什么是装饰器(装饰器又叫做语法糖)
在不改变源代码的基础上扩展新需求,装饰器本身也是函数,应用高阶函数实现
把被装饰的函数内存地址当参数传入装饰器函数体,通过参数调用被装饰的函数
- 语法糖说明
语法糖(Syntactic sugar):
计算机语言中特殊的某种语法
这种语法对语言的功能并没有影响
对于程序员有更好的易用性
能够增加程序的可读性
简而言之,语法糖就是程序语言中提供”奇技淫巧”的一种手段和方式而已。 通过这类方式编写出来的代码,即好看又好用,好似糖一般的语法。固美其名曰:语法糖
装饰器原则
- 不改变源代码
因为函数可能在其他地方各种调用,一改动全身
- 不改变原函数调用顺序
源代码有自己的逻辑处理
- 装饰器逻辑上格式?
高阶函数+嵌套函数
Python装饰器语法糖代码示例
####装饰器的固定格式
##普通版本
def timer(func):
def inner(*args,**kwargs):
'''执行函数之前要做的'''
ret = func(*args,**kwargs)
'''执行函数之后要做的'''
return ret
return inner
##wraps版本
from functools import wraps
def deco(func):
@wraps(func) #加在最内层函数正上方
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper
####带参数的装饰器
def outer(flag):
def timer(func):
def inner(*args,**kwargs):
if flag:
print('''执行函数之前要做的''')
ret = func(*args,**kwargs)
if flag:
print('''执行函数之后要做的''')
return ret
return inner
return timer
@outer(True)
def func():
return '返回值'
x=func()
print(x)
特别注意
Python中装饰器语法并不用每次都用赋值语句。
在函数定义的时候就加上@+装饰器名字即可