装饰器

Python 函数编写

Shayne Miel

Software Architect @ Duo Security

函数

函数

Python 函数编写

装饰器

带装饰器的函数

Python 函数编写

修改输入

修改输入

Python 函数编写

修改输出

修改输出

Python 函数编写

修改函数

修改函数

Python 函数编写

装饰器长什么样?

@double_args
def multiply(a, b):
  return a * b

multiply(1, 5)
20
Python 函数编写

double_args 装饰器

def multiply(a, b):
  return a * b

def double_args(func): return func
new_multiply = double_args(multiply)
new_multiply(1, 5)
5
multiply(1, 5)
5
Python 函数编写

double_args 装饰器

def multiply(a, b):
  return a * b

def double_args(func):
# 定义可修改的新函数 def wrapper(a, b):
# 先调用未修改的函数 return func(a, b)
# 返回新函数 return wrapper
new_multiply = double_args(multiply)
new_multiply(1, 5)
5
Python 函数编写

double_args 装饰器

def multiply(a, b):
  return a * b

def double_args(func): def wrapper(a, b):
# 调用传入函数,但将每个参数翻倍 return func(a * 2, b * 2)
return wrapper
new_multiply = double_args(multiply)
new_multiply(1, 5)
20
Python 函数编写

double_args 装饰器

def multiply(a, b):
  return a * b

def double_args(func): def wrapper(a, b): return func(a * 2, b * 2) return wrapper
multiply = double_args(multiply)
multiply(1, 5)
20
multiply.__closure__[0].cell_contents
<function multiply at 0x7f0060c9e620>
Python 函数编写

装饰器语法

def double_args(func):
  def wrapper(a, b):
    return func(a * 2, b * 2)
  return wrapper

def multiply(a, b): return a * b multiply = double_args(multiply) multiply(1, 5)
20
def double_args(func):
  def wrapper(a, b):
    return func(a * 2, b * 2)
  return wrapper

@double_args def multiply(a, b): return a * b multiply(1, 5)
20
Python 函数编写

Passons à la pratique !

Python 函数编写

Preparing Video For Download...