Python-语法糖(装饰器)理解

Python-语法糖(装饰器)理解

Posted by A Chang on August 27, 2019

前言

在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中装饰器语法并不用每次都用赋值语句。

在函数定义的时候就加上@+装饰器名字即可