一、装饰器无参数

1.原函数无参数

def wrap_in_tag_b(fn): # wrap_in_tag_b 是真正的装饰器def wrapped():return "<b>" + fn() + "</b>"return wrappeddef wrap_in_tag_i(fn):def wrapped():return "<i>" + fn() + "</i>"return wrapped@wrap_in_tag_b
@wrap_in_tag_i
def hello():return "hello"print(hello()) # returns "<b><i>hello world</i></b>"

2.原函数带参数

def wrap_in_tag_b(fn):def wrapped(arg): # arg 是原函数参数return "<b>" + fn(arg) + "</b>"return wrappeddef wrap_in_tag_i(fn):def wrapped(arg): # arg 是原函数参数return "<i>" + fn(arg) + "</i>"return wrapped@wrap_in_tag_b
@wrap_in_tag_i
def hello(name):return "hello {}".formar(name)print(hello('Jack')) 

二、装饰器带参数

1.原函数无参数

def wrap_in_tag(deco_arg):# 装饰器参数:deco_arg# 可以在任意位置使用def real_decorator(func):  # real_decorator才是即将返回的真正的装饰器# 原函数参数:func_arg # 只可以在此位置使用    def wrapped() :return "<{0}>{1}</{0}>".format(deco_arg, func())return wrappedreturn real_decorator@wrap_in_tag('b')
@wrap_in_tag('i')
def hello():return "hello"print(hello())

2.原函数带参数

def wrap_in_tag(deco_arg):# 装饰器参数:deco_arg# 可以在任意位置使用def real_decorator(func):  # real_decorator才是即将返回的真正的装饰器def wrapped(func_arg):# 原函数参数:func_arg# 只可以在此位置使用return "<{0}>{1}</{0}>".format(deco_arg, func(func_arg))return wrappedreturn real_decorator@wrap_in_tag('b')
@wrap_in_tag('i')
def hello(name):return "hello {}".format(name)print(hello('Jack'))

三、装饰器类

1.原函数无参数

class wrap_in_tag(object):def __init__(self, deco_arg):self.tag = deco_arg  # 装饰器参数:deco_argdef __call__(self, func):def newf(): # 原函数无参数return "<{0}>{1}</{0}>".format(self.tag, func())return newf@wrap_in_tag('b')
@wrap_in_tag('i')
def hello():return 'hello'print(hello())

2.原函数带参数

class wrap_in_tag(object):def __init__(self, deco_arg):self.tag = deco_arg # 装饰器参数:deco_argdef __call__(self, func):def newf(func_arg): # 原函数参数: func_argreturn "<{0}>{1}</{0}>".format(self.tag, func(func_arg))return newf@wrap_in_tag('b')
@wrap_in_tag('i')
def hello(name):return "hello {}".format(name)print(hello('Jack'))

四、用装饰器装饰类

1.用函数作为装饰器

def wrap_in_tag(deco_arg):def real_decorator(func):def wrapped(self, func_arg): # 类方法接收第一个参数都是self,这个必须有,而无论func_arg是否有!!!return "<{0}>{1}</{0}>".format(deco_arg, func(func_arg))return wrappedreturn real_decoratorclass foo(object):@wrap_in_tag('b')@wrap_in_tag('i')def hello(self, name):return 'hello {}".format(name)
    @wrap_in_tag('b')@wrap_in_tag('i')def byebye(self, name):return 'byebye {}".format(name)

f = foo()
print(f.hello('Jack')

2.用类作为装饰器

class wrap_in_tag(object):def __init__(self, deco_arg):self.tag = deco_argdef __call__(self, func):def newf(slf, func_arg): # slf必须!self被占用了,那就给第一个参数另一个名字slf(随便)return "<{0}>{1}</{0}>".format(self.tag, func(func_arg))return newfclass foo(object):@wrap_in_tag('b')@wrap_in_tag('i')def hello(self, name):return 'hello {}".format(name)
    @wrap_in_tag('b')@wrap_in_tag('i')def byebye(self, name):return 'byebye {}".format(name)
f = foo()
print(f.hello('Jack'))
 

本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/5147103.html,如需转载请自行联系原作者

Python 装饰器笔记相关推荐

  1. Python装饰器学习笔记

    Python装饰器 文章目录 Python装饰器 基本概念 从零开始的逐步分析 修饰后的问题 向被包装后的函数传递参数 使用场景:stdout日志 接受参数的装饰器 作为一个类的装饰器 总结 学习资料 ...

  2. [译] 12步轻松搞定python装饰器 - 简书

    [译] 12步轻松搞定python装饰器 - 简书 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需要你了解一些函数式编 ...

  3. 一文读懂Python 装饰器函数

    [摘要] Python装饰器的学习笔记 1. 初识装饰器 接下来,我们通过一个例子来为大家讲解这个装饰器: 需求介绍:你现在xx科技有限公司的开发部分任职,领导给你一个业务需求让你完成:让你写代码测试 ...

  4. python装饰器及functools模块

    python装饰器及functools模块 本文是笔者学习python装饰器以及functools模块的笔记. 在开始学习之前,先在此列举出python函数的一些特性: 一切皆对象:python函数也 ...

  5. python简单装饰器_简单介绍Python装饰器(一)

    装饰器的作用 相信大家在 探索过程中已经了解装饰器的作用,也有很多花里胡哨的介绍. 这次小冰也来讲解一下关于Python装饰器的一些小知识. 它的作用: 性能测试 日志 安全验证 ...... 相信大 ...

  6. Python装饰器的神奇功能:自动打印每个方法耗时

    问题: 运行代码时,尤其对于大型项目需要分析每个环节方法耗时的.每个方法前后都写计算耗时及日志打印太繁琐了,而且代码不精简. 解决: Python装饰器类似于Spring的 AOP(Aspect Or ...

  7. python装饰器教学_Python装饰器学习(九步入门)

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...

  8. 简单介绍python装饰器

    这篇文章简单介绍一下python装饰器,希望对你们有所帮助. 简单正常python例子: def up(text):return text.upper() #转成大写 def lo(text):ret ...

  9. Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能

    Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能 目录

最新文章

  1. js去el的map_转:el表达式获取map对象的内容 js中使用el表达式 js 中使用jstl 实现 session.removeattribute...
  2. ASP.NET Core 2 学习笔记(四)依赖注入
  3. 未来,让我们一起想象 — “Imagine” 阿里云视频云全景创新峰会
  4. 算法:位运算加减乘除
  5. centos7安装mysql允许远程连接_CentOS7安装Mysql并配置远程访问
  6. 蓝桥杯十六进制转化为十进制
  7. 2星|《零工经济》:缺少对数据、事实、概括、分析,基本是流于表面的畅想...
  8. [环境]搭建Node+NPM+Grunt+Ruby开发环境
  9. python flask面试题_Flask面试题
  10. 最新Thinkphp免签码支付系统源码+安卓监控端/实测可用
  11. Java 枚举类写法
  12. r7000屏幕亮度linux,联想legion R7000笔记本linux使用体验
  13. HTML在手机端禁止放大缩小
  14. PyQt5快速开发与实战 5.2 容器:装载更多的控件
  15. Bloom Filter算法优化
  16. stm32mp157a-dk1 编译 Ubuntu 20.04固件
  17. E2类 MCR-WPT系统的搭建
  18. tryhackme圣诞挑战2021-Advent of Cyber 3-day2-越权漏洞,修改cookie
  19. 支持使用vlc在chrome等各种浏览器打开rtmp rtsp 谷歌浏览器Chrome播放rtsp视频流解决方案
  20. 保姆级Linux系统安装并使用libpng攻略

热门文章

  1. 浮动和清除(闭合)浮动
  2. 3、Fiddler 如何捕获Firefox的会话
  3. i7处理器好吗_笔记本电脑处理器是i5好还是i7好?为什么?
  4. 若依将ehcache改为redis缓存详细整合步骤
  5. [Ext JS6]视图模型和数据绑定
  6. linux查看消息队列的状态,linux – 如何知道某个时间点在消息队列中收到的消息数...
  7. sql查询三级菜单分类_SQL面试50题——思路解答与分类整理(中)窗口函数与子查询...
  8. Soul网关源码阅读(八)路由匹配初探
  9. 视图与表之间的异同点_灯芯绒面料印花与染色的异同点有哪些?做灯芯绒订单的了解一下...
  10. Java学习之FileInputStream与FileReader的区别