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去除列表中重复元素的方法
Mar 20 Python
小小聊天室Python代码实现
Aug 17 Python
Python如何import文件夹下的文件(实现方法)
Jan 24 Python
详解Python开发中如何使用Hook技巧
Nov 01 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 Python
对python 生成拼接xml报文的示例详解
Dec 28 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
通过实例解析python创建进程常用方法
Jun 19 Python
Python如何测试stdout输出
Aug 10 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
漂亮但不安全的CTB
2006/10/09 PHP
php使用Cookie控制访问授权的方法
2015/01/21 PHP
PHP抓取网页、解析HTML常用的方法总结
2015/07/01 PHP
prototype 学习笔记整理
2009/07/17 Javascript
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
文本框输入时 实现自动提示(像百度、google一样)
2012/04/05 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
2018/09/04 Javascript
详解原生JS动态添加和删除类
2019/03/26 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
urllib2自定义opener详解
2014/02/07 Python
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
荣耀商城:HIHONOR
2020/11/03 全球购物
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
毕业生求职自荐信怎么写
2014/01/08 职场文书
杠杆的科学教学反思
2014/01/10 职场文书
乡镇四风对照检查材料
2014/08/31 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏
图神经网络GNN算法
2022/05/11 Python