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 相关文章推荐
Windows安装Python、pip、easy_install的方法
Mar 05 Python
Python读取文件内容的三种常用方式及效率比较
Oct 07 Python
python虚拟环境virtualenv的使用教程
Oct 20 Python
对numpy中布尔型数组的处理方法详解
Apr 17 Python
搞定这套Python爬虫面试题(面试会so easy)
Apr 03 Python
运用PyTorch动手搭建一个共享单车预测器
Aug 06 Python
python区分不同数据类型的方法
Oct 14 Python
Python中使用gflags实例及原理解析
Dec 13 Python
Python面向对象编程基础实例分析
Jan 17 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
python如何为list实现find方法
May 30 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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
PHP个人网站架设连环讲(二)
2006/10/09 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
潜说js对象和数组
2011/05/25 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
javascript 动态创建表格
2015/01/08 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
node事件循环和process模块实例分析
2020/02/14 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
基于python时间处理方法(详解)
2017/08/14 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
德国自行车商店:Tretwerk
2019/06/21 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
大学生求职简历的自我评价
2013/10/21 职场文书
给水工程专业毕业生自荐信
2014/01/28 职场文书
工艺员岗位职责
2014/02/11 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL