30 装饰器函数:调用闭包函数于无形之中

 欢迎来到@一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力

对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426@qq.com 。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。

    专栏:

文章概述:对装饰器函数的介绍

关键词:装饰器函数

本文目录

Python装饰器

实现更通用的装饰器函数

  

Python装饰器

装饰器就是一种闭包,它可以使闭包的访问方式更简单。本质上,装饰器(decorator)就是一个返回函数的高阶函数。

在Python中使用装饰器,需要使用一个特殊的符号“@”来实现。在定义装饰器函数或类时,使用“@装饰器名称”的形式将符号“@”放在函数或类的定义行之前。

def f1(func):
  def wrapper():
    print('Started')
    func()
    print('Ended')
  return wrapper

def f():
  print('Hello')
  
//方法1  
f1(f)()
//方法2
f=f1(f)
f()

两者等价

使用装饰器

def f1(func):
  def wrapper():
    print('Started')
    func()
    print('Ended')
  return wrapper

@f1
def f():
  print('Hello')
  
f()

实现更通用的装饰器函数

实际上,每次调用f函数的时候,会把f作为参数传给f1,然后再调用返回的闭包函数~

def f1(func):
  def wrapper(*args, **kwargs):
    print('Started')
    func(*args, **kwargs)
    print('Ended')
  return wrapper

@f1
def f(a):
  print(a)
  
f('Hi!')

@f1
def f(a, b=9):
  print(a, b)
  
f('Hi!')

返回值

def f1(func):
  def wrapper(*args, **kwargs):
    print('Started')
    val = func(*args, **kwargs)
    print('Ended')
    return val
  return wrapper

@f1
def add(x,y):
  return x+y


print(add(4,5))

比如测试算法耗用时间

import time

def timer(func):
  def wrapper():
    before = time.time()
    func()
    print('Function took:', time.time()-before, 'seconds')
  return wrapper

@timer
def run():
  time.sleep(2)
  
run()

比如自动记录日志

str(arg) for arg in args就是将每个数转换成字符串的形式

import datetime

def log(func):
  def wrapper(*args, **kwargs):
    with open("logs.txt", "a") as f:
      f.write("Called function with "+ " ".join([str(arg) for arg in args])+" at "+str(datetime.datetime.now())+"\n")
    val = func(*args, **kwargs)
    return val
  return wrapper

@log
def run(a, b, c=9):
  print(a+b+c)
  
run(1,3,c=9)

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值