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科学计算环境推荐——Anaconda
Jun 30 Python
Python实现的一个简单LRU cache
Sep 26 Python
在Django中进行用户注册和邮箱验证的方法
May 09 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
matplotlib给子图添加图例的方法
Aug 03 Python
Python 忽略warning的输出方法
Oct 18 Python
深入了解Python在HDA中的应用
Sep 05 Python
DJango的创建和使用详解(默认数据库sqlite3)
Nov 18 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
浅谈Python3中print函数的换行
Aug 05 Python
python基于tkinter制作m3u8视频下载工具
Apr 24 Python
基于tensorflow权重文件的解读
May 26 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
Ajax PHP分页演示
2007/01/02 PHP
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
php实现的农历算法实例
2015/08/11 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
laravel自定义分页效果
2017/07/23 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
JavaScript库 开发规则
2009/01/31 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
js图片放大镜效果实现方法详解
2020/10/28 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
node实现基于token的身份验证
2018/04/09 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
Python通过Django实现用户注册和邮箱验证功能代码
2017/12/11 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
在pycharm中显示python画的图方法
2019/08/31 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
库房主管岗位职责
2013/12/31 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
党建工作整改措施
2014/10/28 职场文书
商务考察邀请函模板
2015/02/02 职场文书
公司行政管理制度范本
2015/08/05 职场文书
详解Java实践之适配器模式
2021/06/18 Java/Android