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中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
python中类变量与成员变量的使用注意点总结
Apr 29 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
Java分治归并排序算法实例详解
Dec 12 Python
Python将多份excel表格整理成一份表格
Jan 03 Python
新手入门Python编程的8个实用建议
Jul 12 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
Python工程师必考的6个经典面试题
Jun 28 Python
python 解决函数返回return的问题
Dec 05 Python
python实现代码审查自动回复消息
Feb 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
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
一个比较简单的PHP 分页分组类
2009/12/10 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
php计算年龄精准到年月日
2015/11/17 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
菜鸟学习JavaScript小实验之函数引用
2010/11/17 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
解析ajaxFileUpload 异步上传文件简单使用
2016/12/30 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
JavaScript实现消消乐的源代码
2021/01/12 Javascript
python使用win32com库播放mp3文件的方法
2015/05/30 Python
简单了解Django ContentType内置组件
2019/07/23 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
公务员总结性个人自我评价
2013/12/05 职场文书
家电业务员岗位职责
2014/03/10 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
2014年变电站工作总结
2014/12/19 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python
Python中使用Lambda函数的5种用法
2021/04/01 Python
Go语言安装并操作redis的go-redis库
2022/04/14 Golang