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的函数嵌套的使用方法
Jan 24 Python
python生成器generator用法实例分析
Jun 04 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
对python 读取线的shp文件实例详解
Dec 22 Python
python 处理数字,把大于上限的数字置零实现方法
Jan 28 Python
Python装饰器使用你可能不知道的几种姿势
Oct 25 Python
python 实现矩阵填充0的例子
Nov 29 Python
python实现吃苹果小游戏
Mar 21 Python
Django数据库迁移常见使用方法
Nov 12 Python
python中doctest库实例用法
Dec 31 Python
python opencv旋转图片的使用方法
Jun 04 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
php微信公众号开发之简答题
2018/10/20 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
JS动态显示表格上下frame的方法
2015/03/31 Javascript
js获取form的方法
2015/05/06 Javascript
asp.net中oracle 存储过程(图文)
2015/08/12 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
angular6根据environments配置文件更改开发所需要的环境的方法
2019/03/06 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
详解Python字符串切片
2019/05/20 Python
Python 求数组局部最大值的实例
2019/11/26 Python
简单了解python调用其他脚本方法实例
2020/03/26 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
大学毕业通用个人的求职信
2013/12/08 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
医学生求职自荐书
2014/06/12 职场文书
优秀会计求职信
2014/07/04 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
放飞梦想演讲稿600字
2014/08/26 职场文书
简历中的自我评价应该这样写!
2019/07/12 职场文书
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏