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生成指定尺寸缩略图的示例
May 07 Python
Python实现简单拆分PDF文件的方法
Jul 30 Python
小议Python中自定义函数的可变参数的使用及注意点
Jun 21 Python
python dict.get()和dict['key']的区别详解
Jun 30 Python
python 读写文件,按行修改文件的方法
Jul 12 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
python列表使用实现名字管理系统
Jan 30 Python
使用python实现简单五子棋游戏
Jun 18 Python
如何使用python爬虫爬取要登陆的网站
Jul 12 Python
Django model update的多种用法介绍
Mar 28 Python
在keras 中获取张量 tensor 的维度大小实例
Jun 10 Python
实例详解Python的进程,线程和协程
Mar 13 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
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
javascript网页关键字高亮代码
2008/07/30 Javascript
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
javascript动态加载二
2012/08/22 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
vue-cli的webpack模板项目配置文件分析
2017/04/01 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
JavaScript笛卡尔积超简单实现算法示例
2018/07/30 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
Python Tkinter 简单登录界面的实现
2019/06/14 Python
在python里面运用多继承方法详解
2019/07/01 Python
python使用建议与技巧分享(一)
2020/08/17 Python
特色冷饮店创业计划书
2014/01/28 职场文书
就业推荐表自我鉴定范文
2014/03/21 职场文书
理想演讲稿范文
2014/05/21 职场文书
地震捐款倡议书
2014/08/29 职场文书
教师工作总结范文2014
2014/11/10 职场文书
怎样写辞职信
2015/02/27 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
利用html+css实现菜单栏缓慢下拉效果的示例代码
2021/03/30 HTML / CSS
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技