Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】


Posted in Python onOctober 17, 2019

本文实例讲述了Python 装饰器@,对函数进行功能扩展操作。分享给大家供大家参考,具体如下:

装饰器可以对原函数进行功能扩展,但还不需要修改原函数的内容(开闭原则),也不需要修改原函数的调用。

demo.py(装饰器,@):

# 闭包
def w1(func):
  def inner():
    # 对原函数进行功能扩展
    print("功能扩展")
    func()
    # return func() # 如果原函数需要返回值,可以return
  return inner # 闭包
@w1
# 相当于 f1 = w1(f1)
def f1():
  print('f1') # 原函数不需要修改
f1() # 原函数的调用也不需要修改

demo.py(装饰器通用格式,对不定长参数并且有返回值的函数进行装饰):

def set_func(func):
  def call_func(*args, **kwargs):
    print("装饰器扩展的功能")
    return func(*args, **kwargs) # 这里的*和*表示拆包。 不管有没有返回值,return都没问题。
  return call_func
@set_func # 相当于 test1 = set_func(test1)
# 对含有不定长参数并且有返回值的函数进行装饰。
def test1(num, *args, **kwargs):
  print("-----test1----%d" % num)
  return "ok"
ret = test1(100)
print(ret)

demo.py(多个装饰器的装饰顺序):

def add_1(func):
  def call_func(*args, **kwargs):
    print("装饰器1 扩展的功能")
    return func(*args, **kwargs)
  return call_func
def add_2(func):
  def call_func(*args, **kwargs):
    print("装饰器2 扩展的功能")
    return func(*args, **kwargs)
  return call_func
@add_2
@add_1
# 先装饰add_1,再装饰add_2
def test1():
  print("------test1------")
test1() # 在调用函数之前就已经装饰好了。
# 装饰器2 扩展的功能
# 装饰器1 扩展的功能
# ------test1------

demo.py(用类充当装饰器):

# 用类充当装饰器
class Test(object):
  def __init__(self, func):
    self.func = func
  def __call__(self, *args, **kwargs):
    print("这里是装饰器添加的功能.....")
    return self.func(*args, **kwargs)
@Test # 相当于get_str = Test(get_str) # 实例化对象,调用__init__方法。
def get_str():
  return "haha"
print(get_str())  # 实例对象(),会自动调用对象的__call__方法。

@functools.wraps修饰装饰器的内层函数。(修饰内层函数后,被装饰器装饰的函数的__name__、__doc__不会被装饰器改变)

demo.py(@functools.wraps修饰装饰器的内层函数):

# coding:utf-8
import functools # 导入
# 自定义的装饰器
def login_required(func):
  @functools.wraps(func)
  # 装饰器的内层函数,一般要加@functools.wraps装饰器
  def wrapper(*arg, **kwargs):
    """wrapper的说明文档"""
    # 。。。
    return func(*arg, **kwargs)
  return wrapper
# 使用自定义的装饰器
@login_required
def demofunc():
  """demofunc的说明文档"""
  pass
print(demofunc.__name__)  # 不加@functools.wraps装饰器时:"wrapper"。 加装饰器时:"demofunc"
print(demofunc.__doc__)  # 不加@functools.wraps装饰器时:"wrapper的说明文档"。 加装饰器时:"demofunc的说明文档"

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python绘制双柱形图代码实例
Dec 14 Python
python中的变量如何开辟内存
Jun 26 Python
Python实现查找最小的k个数示例【两种解法】
Jan 08 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
Apr 18 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
django多种支付、并发订单处理实例代码
Dec 13 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
Jan 25 Python
Python实现ElGamal加密算法的示例代码
Jun 19 Python
python怎么删除缓存文件
Jul 19 Python
如何理解python接口自动化之logging日志模块
Jun 15 Python
python实现复制文件到指定目录
Oct 16 #Python
如何解决django-celery启动后迅速关闭
Oct 16 #Python
Python发送邮件的实例代码讲解
Oct 16 #Python
python运用sklearn实现KNN分类算法
Oct 16 #Python
python sklearn常用分类算法模型的调用
Oct 16 #Python
Python使用selenium + headless chrome获取网页内容的方法示例
Oct 16 #Python
使用python实现kNN分类算法
Oct 16 #Python
You might like
基于mysql的bbs设计(一)
2006/10/09 PHP
浅析php数据类型转换
2014/01/09 PHP
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
详解Bootstrap glyphicons字体图标
2016/01/04 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
基于JavaScript实现滑动门效果
2017/03/16 Javascript
Angular组件化管理实现方法分析
2017/03/17 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
用node-webkit把web应用打包成桌面应用(windows环境)
2018/02/01 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
微信小程序实现图片上传功能
2018/05/28 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
小程序分享链接onShareAppMessage的具体用法
2020/05/22 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
[03:56]DOTA2完美大师赛趣味视频之小鸽子和Mineski打台球
2017/11/24 DOTA
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python如何实现守护进程的方法示例
2017/02/08 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
wxpython布局的实现方法
2019/11/01 Python
Django在Model保存前记录日志实例
2020/05/14 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
大专应届生个人简历的自我评价
2013/10/15 职场文书
高中毕业自我鉴定
2013/12/13 职场文书
综合实践活动方案
2014/02/14 职场文书
个性发展自我评价2015
2015/03/09 职场文书
介绍信怎么写
2015/05/05 职场文书
初婚未育证明样本
2015/06/18 职场文书
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android