简单装饰器

def log_time(func):  # 此函数的作用时接受被修饰的函数的引用test,然后被内部函数使用def make_decorater():print('现在开始装饰')func()print('现在结束装饰')return make_decorater  # log_time()被调用后,运行此函数返回make_decorater()函数的引用make_decorater@log_time  # 此行代码等同于,test=log_time(test)=make_decorater
def test():print('我是被装饰的函数')
test()  # test()=make_decorater()

调试结果
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
现在开始装饰
我是被装饰的函数
现在结束装饰Process finished with exit code 0

带参的

形参

def log_time(func):def make_decorater(*args,**kwargs):  # 接受调用语句的实参,在下面传递给被装饰函数(原函数)print('现在开始装饰')test_func = func(*args,**kwargs)  # 如果在这里return,则下面的代码无法执行,所以引用并在下面返回print('现在结束装饰')return test_func  # 因为被装饰函数里有return,所以需要给调用语句(test(2))一个返回,又因为test_func = func(*args,**kwargs)已经调用了被装饰函数,这里就不用带()调用了,区别在于运行顺序的不同。return make_decorater@log_time
def test(num):print('我是被装饰的函数')return num+1a = test(2)  # test(2)=make_decorater(2)
print(a)

传入注解的参数注意!有两个return,log_time函数也要return

def get_parameter(*args,**kwargs):  # 工厂函数,用来接受@get_parameter('index.html/')的'index.html/'def log_time(func):def make_decorater():print(args,kwargs)print('现在开始装饰')func()print('现在结束装饰')return make_decoraterreturn log_time              @get_parameter('index.html/')
def test():print('我是被装饰的函数')# return num+1test()  # test()=make_decorater()

D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
('index.html/',) {}
现在开始装饰
我是被装饰的函数
现在结束装饰Process finished with exit code 0

装饰器:在不修改函数源代码的基础上,添加函数功能

一个简单的装饰器

1
2
3
4
5
6
7
8
9
10
11
def log_time(func):  # 此函数的作用时接受被修饰的函数的引用test,然后被内部函数使用
    def make_decorater():
        print('现在开始装饰')
        func()
        print('现在结束装饰')
    return make_decorater  # log_time()被调用后,运行此函数返回make_decorater()函数的引用make_decorater
@log_time  # 此行代码等同于,test=log_time(test)=make_decorater
def test():
    print('我是被装饰的函数')
test()  # test()=make_decorater()

1
2
3
4
5
6
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
现在开始装饰
我是被装饰的函数
现在结束装饰
Process finished with exit code 0

当被装饰的函数有形参时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def log_time(func):
    def make_decorater(*args,**kwargs):  # 接受调用语句的实参,在下面传递给被装饰函数(原函数)
        print('现在开始装饰')
        test_func = func(*args,**kwargs)  # 如果在这里return,则下面的代码无法执行,所以引用并在下面返回
        print('现在结束装饰')
        return test_func  # 因为被装饰函数里有return,所以需要给调用语句(test(2))一个返回,又因为test_func = func(*args,**kwargs)已经调用了被装饰函数,这里就不用带()调用了,区别在于运行顺序的不同。
    return make_decorater
@log_time
def test(num):
    print('我是被装饰的函数')
    return num+1
= test(2)  # test(2)=make_decorater(2)
print(a)

1
2
3
4
5
6
7
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
现在开始装饰
我是被装饰的函数
现在结束装饰
3
Process finished with exit code 0

当@装饰器后有参数时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def get_parameter(*args,**kwargs):  # 工厂函数,用来接受@get_parameter('index.html/')的'index.html/'
    def log_time(func):
        def make_decorater():
            print(args,kwargs)
            print('现在开始装饰')
            func()
            print('现在结束装饰')
        return make_decorater
    return log_time
@get_parameter('index.html/')
def test():
    print('我是被装饰的函数')
    # return num+1
test()  # test()=make_decorater()

1
2
3
4
5
6
7
D:\pycharm_project\装饰器\venv\Scripts\python.exe D:/pycharm_project/装饰器/venv/装饰器.py
('index.html/',) {}
现在开始装饰
我是被装饰的函数
现在结束装饰
Process finished with exit code 0

转载于:https://www.cnblogs.com/daysn/p/10796469.html

python :编写装饰器相关推荐

  1. python编写装饰器_写python中的装饰器

    python中的装饰器主要用于在已有函数实现功能前附加需要输出的信息,下面将用实例展示我如何写装饰器. 首先分别尝试写装饰器装饰一个无参函数和一个有参函数(被装饰函数仅输出,无返回值情况下) 1 de ...

  2. python编写装饰器_我也来写一下python装饰器

    有借用,但原文出处已经找不到了,根据笔记分享一下解释器的基础. 下面的代码表示,等待两秒钟,输出'test is running'. 现在要求增加统计程序运行时间的功能. 等待两秒钟,输出'test ...

  3. Python之装饰器

    Python之装饰器 在不修改函数调用方式的前提下,也不能修改函数内部源代码!!!! 例如: 在每个季度公司发绩效,统计每个人的代码执行效率.咱们总不能是每个函数里加time模块吧. import t ...

  4. Python设计模式-装饰器模式

    Python设计模式-装饰器模式 代码基于3.5.2,代码如下; #coding:utf-8 #装饰器模式class Beverage():name = ""price = 0.0 ...

  5. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景

    装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...

  6. python装饰器函数-Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  7. python类装饰器详解-Python类装饰器实现方法详解

    本文实例讲述了Python类装饰器.分享给大家供大家参考,具体如下: 编写类装饰器 类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管理类自身,或者用来拦截实例创建调用以管理实例. 单体类 ...

  8. python装饰器-Python @函数装饰器及用法(超级详细)

    前面章节中,我们已经讲解了 Python 内置的 3 种函数装饰器,分别是 @staticmethod.@classmethod 和 @property,其中 staticmethod().class ...

  9. python装饰器原理-Python函数装饰器原理与用法详解

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  10. Python 函数装饰器

    装饰器(Decorators)是 Python 的一个重要部分.简单地说:他们是修改其他函数的功能的函数.他们有助于让我们的代码更简短,也更Pythonic(Python范儿).大多数初学者不知道在哪 ...

最新文章

  1. 正则表达式实现将html文本转换为纯文本格式(将html字符串转换为纯文本方法)
  2. python循环数组判断,python的数据类型、数组、条件判断、循环的基础知识
  3. 撩妹学会这一招,就没有人能拒绝你!
  4. ubuntu ifconfig只有lo没有ens33的问题
  5. zookeeper下载安装过程
  6. linux有许多sed进程,Linux进程与性能监控
  7. 拓端tecdat|R语言用多重插补法估算相对风险
  8. Atitit 界面接口技术 cli gui nui cui管理 attilax总结 1. NUI 1 1.1. 问:什么是“自然用户界面”? 1 2. Cli到gui到nui CUI 2 2.1.
  9. 计算机地图制图的点状符号制作,计算机地图制图地图符号库系统建立..doc
  10. MOOC-首都师范-博弈论-焦宝聪-第六章-动态博弈学习笔记(五)
  11. 前世回眸,今生结缘,滚滚红尘,谁人可依
  12. 微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之前)
  13. python+selenium自动登录163邮箱代码提示错误解决方案(如:NoSuchFrameException: Message: no such frame)
  14. MySQL通过命令导入导出数据
  15. 第05章 深度卷积神经网络模型
  16. 小程序毕设作品之微信美食菜谱小程序毕业设计成品(3)后台功能
  17. csgo服务器响应参数,csgo必备弹道参数 影响弹道参数设置
  18. brpc搭建、编译和使用
  19. hugetable和mysql区别_BigData-MySQL总结大全(一)苏暖人
  20. 服务器电源ic芯片,AC-DC适配器电源IC芯片方案选型表

热门文章

  1. django css,Django表单中的CSS样式
  2. python黑帽编程视频_Python黑帽编程 3.4 跨越VLAN详解
  3. 开发对接微信卡包会员卡_产品||AI刷脸会员+电子会员卡
  4. CentOS7 修改静态IP
  5. 构建第一个Spring Boot2.0应用之集成dubbo上---环境搭建(九)
  6. 阿里云云盾 · 云防火墙技术解读:零配置业务自动分组,安全管理有序、可见...
  7. 如何反编译.apk(注:CSDN上提供的资源过时了,都用不了)
  8. 《Nmap渗透测试指南》—第6章6.6节源端口欺骗
  9. 【转】XCode环境变量及路径设置 -- 待学习
  10. math.floor实现四舍五入