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实现字符串格式化输出的方法详解
Sep 20 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
Python线性回归实战分析
Feb 01 Python
python OpenCV学习笔记实现二维直方图
Feb 08 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
Jun 21 Python
浅谈Django2.0 加xadmin踩的坑
Nov 15 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
Jan 08 Python
Python-OpenCV教程之图像的位运算详解
Jun 21 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
Apr 02 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
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
解析php中如何直接执行SHELL
2013/06/28 PHP
PHP 正则判断中文UTF-8或GBK的思路及具体实现
2013/11/26 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
2014/06/19 PHP
php实现网站留言板功能
2015/11/04 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
2019/04/10 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
Python实现多行注释的另类方法
2014/08/22 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
什么是唯一索引
2015/07/05 面试题
25道Java面试题集合
2013/05/21 面试题
公路绿化方案
2014/05/12 职场文书
课程设计的心得体会
2014/09/03 职场文书
硕士论文致谢范文
2015/05/14 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
小学安全教育主题班会
2015/08/12 职场文书