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抓取百度首页的方法
May 19 Python
python reduce 函数使用详解
Dec 05 Python
numpy自动生成数组详解
Dec 15 Python
基于python list对象中嵌套元组使用sort时的排序方法
Apr 18 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
Oct 09 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
Oct 22 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
python打包成so文件过程解析
Sep 28 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
详解python中groupby函数通俗易懂
May 14 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
PyTorch中Tensor的数据类型和运算的使用
Sep 03 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
无数据库的详细域名查询程序PHP版(1)
2006/10/09 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
php设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
PHP之autoload运行机制实例分析
2014/08/28 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
获取当前网页document.url location.href区别总结
2008/05/10 Javascript
js 验证身份证信息有效性
2014/03/28 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
实例讲解JavaScript中call、apply、bind方法的异同
2016/09/13 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
vue中jsonp插件的使用方法示例
2020/09/10 Javascript
详解vue 组件注册
2020/11/20 Vue.js
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
python删除某个字符
2018/03/19 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
英国网上超市:Ocado
2020/03/05 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
司机的工作范围及职责
2013/11/13 职场文书
会计专业应届生求职信
2013/11/24 职场文书
支教自我鉴定
2014/01/18 职场文书
安全标语口号
2014/06/09 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书