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中的XML 工具
Apr 13 Python
利用ctypes提高Python的执行速度
Sep 09 Python
Python使用openpyxl读写excel文件的方法
Jun 30 Python
python实现二分查找算法
Sep 21 Python
PyCharm代码格式调整方法
May 23 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
使用python判断jpeg图片的完整性实例
Jun 10 Python
python双端队列原理、实现与使用方法分析
Nov 27 Python
PyTorch中的padding(边缘填充)操作方式
Jan 03 Python
Python Matplotlib简易教程(小白教程)
Jul 28 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
Jun 09 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
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
PHP实现批量检测网站是否能够正常打开的方法
2016/08/23 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
用实例解释Python中的继承和多态的概念
2015/04/27 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
解决python3插入mysql时内容带有引号的问题
2020/03/02 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
python hmac模块验证客户端的合法性
2020/11/07 Python
英国旅游额外服务市场领导者:Holiday Extras(机场停车场、酒店、接送等)
2017/10/07 全球购物
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
团代会邀请函
2015/02/02 职场文书
2015年外联部工作总结
2015/04/03 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB