Python 装饰器笔记
一、装饰器无参数
1.原函数无参数
def wrap_in_tag_b(fn): # wrap_in_tag_b 是真正的装饰器
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped def 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 wrapped def 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 wrapped
return 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 wrapped
return 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_arg def __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_arg def __call__(self, func):
def newf(func_arg): # 原函数参数: func_arg
return "<{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 wrapped
return real_decorator class 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_arg def __call__(self, func):
def newf(slf, func_arg): # slf必须!self被占用了,那就给第一个参数另一个名字slf(随便)
return "<{0}>{1}</{0}>".format(self.tag, func(func_arg))
return newf class 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'))
Python 装饰器笔记的更多相关文章
- Python装饰器笔记
DRY(Don't Repeat Yourself)原则: 一般是指在写代码的时候尽量避免重复的实现.违反DRY原则导致的坏处很容易理解,例如维护困难,修改时一旦遗漏就会产生不易察觉的问题. 一.函数 ...
- Python 装饰器(笔记,非原创)
定义:本质是函数,为其他函数添加附加功能原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式知识储备: 1.函数即“变量” 2.高阶函数 ...
- Python 装饰器学习心得
最近打算重新开始记录自己的学习过程,于是就捡起被自己废弃了一年多的博客.这篇学习笔记主要是记录近来看的有关Python装饰器的东西. 0. 什么是装饰器? 本质上来说,装饰器其实就是一个特殊功能的函数 ...
- Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案
本文为霍格沃兹测试学院学员学习笔记. Python 装饰器简介 装饰器(Decorator)是 Python 非常实用的一个语法糖功能.装饰器本质是一种返回值也是函数的函数,可以称之为“函数的函数”. ...
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
随机推荐
- C#自定义控件的创建
1.创建自定义控件 选择[经典桌面]——[窗体控件库] 2.添加控件,组合成一个新的控件 自定义控件功能:打开一张图片,将图片展示在pictureBox控件中,并将图片的名称.大小.尺寸显示出来 控件 ...
- 简单解析Spring核心IOC容器原理
将大体流程解析了一边,具体可以看源代码一个方法一个方法的跟下 XmlBeanFactory的功能是建立在DefaultListableBeanFactory这个基本容器的基础上的,并在这个基本容器的基 ...
- OC实用转换model的工具
OC实用转换model的工具 说明 这是本人写的一个专门用来将json数据直接转换生成Model文件的工具,目的是为了让你从写Model文件的繁琐过程中解脱出来,提升效率以及减少出错的几率,工具的特点 ...
- Linux 软硬链接详解
软链接 软链接: 类似于windows的快捷方式,—>文本文件,但是包含了真实文件的地址 源文件删除,则软连接也删除 软链接可以放在任何文 ...
- ZT 二分插入排序也称折半插入排序
二分插入排序也称折半插入排序,基本思想是:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数 x ,利用二分查找算法找到 ...
- SQL Server中搜索特定的对象
一.注释中带某关键字的对象 主要用到 sys.tables .sys.columns .sys.procedures 系统对象表以及sys.extended_properties 扩展属性表 --查 ...
- python 控制台单行刷新,多行刷新
先贴出单行刷新实现的进度条: 对于控制台的单行刷新,比较简单,先直接贴出代码: strarrs = ['/','|','\\'] for i in range(15): sys.stdout.writ ...
- Spring 利用PropertyPlaceholderConfigurer占位符
Hey Girl 博客园 首页 博问 闪存 新随笔 订阅 管理 posts - 42, comments - 3, trackbacks - 0 Sp ...
- spring中MessageSource的配置使用方法3--ResourceBundleMessageSource【转】
本文转载仅供自己学习收录,不做任何商业用途,如有需要请访问原地址:http://blog.csdn.net/qyf_5445/article/details/8124431 ApplicationCo ...
- JavaScript实现限时抢购实例
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...