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 urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
Python常用随机数与随机字符串方法实例
Apr 09 Python
python统计日志ip访问数的方法
Jul 06 Python
python文件操作相关知识点总结整理
Feb 22 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
python write无法写入文件的解决方法
Jan 23 Python
详解python多线程之间的同步(一)
Apr 03 Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 Python
Python切图九宫格的实现方法
Oct 10 Python
Python实现自动签到脚本的示例代码
Aug 19 Python
python_tkinter事件类型详情
Mar 20 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
example2.php
2006/10/09 PHP
推荐文章系统(一)
2006/10/09 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
document.compatMode介绍
2009/05/21 Javascript
JS学习之一个简易的日历控件
2010/03/24 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
javascript中caller和callee详解
2015/08/10 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
[07:06]2018DOTA2国际邀请赛寻真——卫冕冠军Team Liquid
2018/08/10 DOTA
python迭代器与生成器详解
2016/03/10 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
django 常用orm操作详解
2017/09/13 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
OpenCV灰度化之后图片为绿色的解决
2020/12/01 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
H&M旗下高端女装品牌:& Other Stories
2018/05/07 全球购物
美国韩国化妆品和护肤品购物网站:Beautytap
2018/07/29 全球购物
管理部部长岗位职责
2013/12/05 职场文书
大二法英学生职业生涯规划范文
2014/02/27 职场文书
教师产假请假条
2014/04/10 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
高三毕业感言
2015/07/30 职场文书
详解Vue的options
2021/05/15 Vue.js