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 相关文章推荐
pygame学习笔记(6):完成一个简单的游戏
Apr 15 Python
Python2.x版本中cmp()方法的使用教程
May 14 Python
ubuntu中配置pyqt4环境教程
Dec 27 Python
python+pillow绘制矩阵盖尔圆简单实例
Jan 16 Python
实例介绍Python中整型
Feb 11 Python
python基于pdfminer库提取pdf文字代码实例
Aug 15 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
python支持多线程的爬虫实例
Dec 21 Python
tensorflow使用CNN分析mnist手写体数字数据集
Jun 17 Python
django前端页面下拉选择框默认值设置方式
Aug 09 Python
matplotlib教程——强大的python作图工具库
Oct 15 Python
numpy array找出符合条件的数并赋值的示例代码
Jun 01 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
php 数组的创建、调用和更新实现代码
2009/03/09 PHP
PHP 时间转换Unix时间戳代码
2010/01/22 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
PHP网络操作函数汇总
2015/05/18 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
javascript中字符串拼接详解
2014/09/26 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
详解python时间模块中的datetime模块
2016/01/13 Python
Python之web模板应用
2017/12/26 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
python程序 创建多线程过程详解
2019/09/23 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
如何基于Python创建目录文件夹
2019/12/31 Python
Python autoescape标签用法解析
2020/01/17 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
Original Penguin美国官网:布拉德皮特、强尼德普喜爱的服装品牌
2016/10/25 全球购物
求职简历自荐信
2013/10/20 职场文书
网上卖盒饭创业计划书范文
2014/02/07 职场文书
幼儿园教师获奖感言
2014/03/11 职场文书
工厂采购员岗位职责
2015/04/07 职场文书
学校学期工作总结
2015/08/13 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android