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 相关文章推荐
Python3 能振兴 Python的原因分析
Nov 28 Python
python回调函数用法实例分析
May 09 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
Python socket编程实例详解
May 27 Python
Python中functools模块的常用函数解析
Jun 30 Python
python实现NB-IoT模块远程控制
Jun 20 Python
Appium Python自动化测试之环境搭建的步骤
Jan 23 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
python控制台实现tab补全和清屏的例子
Aug 20 Python
Python3 webservice接口测试代码详解
Jun 23 Python
python中time.ctime()实例用法
Feb 03 Python
python开发制作好看的时钟效果
May 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
php字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
PHP实现动态获取函数参数的方法示例
2018/04/02 PHP
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
python retrying模块的使用方法详解
2019/09/25 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
销售文员的岗位职责
2013/11/20 职场文书
经理秘书找工作求职信
2013/12/19 职场文书
会计自我鉴定
2014/02/04 职场文书
《黄河颂》教学反思
2014/02/07 职场文书
大学学习计划书范文
2014/05/02 职场文书
安全生产计划书
2014/05/04 职场文书
节约用水的口号
2014/06/20 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
售房协议书范本2014
2014/10/23 职场文书
2015年清明节扫墓演讲稿
2015/03/18 职场文书
客户答谢会致辞
2015/07/30 职场文书
Java输出Hello World完美过程解析
2021/06/13 Java/Android