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 ...
随机推荐
- Windows 7系统启动MongoDB失败解决办法?
问题现象: 1.在配置Python环境安装MongoDB时发现在“服务”里面手动启动失败,报错如下: 2.在cmd里面也无法启动,注意这里要以管理员身份启动cmd哦 问题解决: 1.需要先在bin下执 ...
- systemd 之 systemctl
Systemd 常规操作与彩蛋 一.前言 上了俩个月的RHCE工程师的班,收获颇多.话说回来,在 redhat 7 中有个非常重要的概念,即:systemd systemd 是 Linux 下的一款系 ...
- 新建一个去除storyboard的项目
新建一个去除storyboard的项目 1. 新建项目并删除 *.storyboard 以及与之相关的杂项 2. 设置 UIWindow 的 rootViewController 复制粘贴代码如下 s ...
- Celery学习--- Celery操作之定时任务
celery支持定时任务,设定好任务的执行时间,celery就会定时自动帮你执行, 这个定时任务模块叫celery beat 文件定时执行任务 项目前提: 安装并启动Redis celery_Sche ...
- springmvc常用的组件,注解,跳转
路径映射 XXXHandlerMapping 随开发配置越来越多 注解到java代码中来简化xml配置 请求到哪个Controller 控制器bean Controller 随着开发配置越来越多 注解 ...
- mysql 批量插入500W 测试
set_time_limit(800);$dsn = 'mysql:host=localhost;dbname=test';$db = new PDO($dsn,'root','',array(PDO ...
- docker 自制alpine-lnp镜像
简单粗暴点吧 jenkins 镜像下载:docker pull jenkins:alpine dockfile 原地址:https://gist.github.com/phith0n/373cc078 ...
- (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
1.Map集合(重点)1.1 常用的方法 Set<Map.Entry<K,V>> entrySet() - 用于将Map集合转换为Set集合. 其中Map.Entry<K ...
- 内置数据结构(tuple)
一.元组(tuple) 元组不能增.删和改,所以元组的元素只能查. tp = tuple() #初始化一个元组 tp = () #同上 tp = (1, 2, 3, 4,) #错误的定义元组方式 t ...
- October 06th 2017 Week 40th Friday
The greatest ideal man can set before himself is self-perfection. 一个人最高的理想是自我完善. To be better than t ...