一、装饰器无参数

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 装饰器笔记的更多相关文章

  1. Python装饰器笔记

    DRY(Don't Repeat Yourself)原则: 一般是指在写代码的时候尽量避免重复的实现.违反DRY原则导致的坏处很容易理解,例如维护困难,修改时一旦遗漏就会产生不易察觉的问题. 一.函数 ...

  2. Python 装饰器(笔记,非原创)

    定义:本质是函数,为其他函数添加附加功能原则:1.不能修改被装饰的函数的源代码         2.不能修改被装饰的函数的调用方式知识储备:       1.函数即“变量”       2.高阶函数  ...

  3. Python 装饰器学习心得

    最近打算重新开始记录自己的学习过程,于是就捡起被自己废弃了一年多的博客.这篇学习笔记主要是记录近来看的有关Python装饰器的东西. 0. 什么是装饰器? 本质上来说,装饰器其实就是一个特殊功能的函数 ...

  4. Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案

    本文为霍格沃兹测试学院学员学习笔记. Python 装饰器简介 装饰器(Decorator)是 Python 非常实用的一个语法糖功能.装饰器本质是一种返回值也是函数的函数,可以称之为“函数的函数”. ...

  5. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  6. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  7. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  8. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  9. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

随机推荐

  1. Oracle EBS 跳跳转标准销售订单程序转标准销售订单程序

    -- 打开PO PROCEDURE Btn_Open_Po IS BEGIN Fnd_Function.Execute(Function_Name => 'PO_POXPOEPO', Open_ ...

  2. [WINDOWS MOBILE | SOLUTION] 通过有线连接到 PC 后,WM设备能 PING 通网关但是不能上网

    在 Windows Mobile Device Center 处点击 Mobile Device Settings, Connection Settings, 选择 This computer con ...

  3. [SQL Server]利用索引改善sql语句

    很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: 1.select * from table1 where name=''z ...

  4. asp.net 一般处理程序实现网站验证码

    使用VerifyCode.ashx一般处理程序生成验证码,实现如下: using System; using System.Drawing; using System.Web; using Syste ...

  5. Linux的Transparent Hugepage与关闭方法

    Transparent HugePages是在运行时动态分配内存的,而标准的HugePages是在系统启动时预先分配内存,并在系统运行时不再改变. 因为Transparent HugePages是在运 ...

  6. memcache知识梳理

    定义: memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的.需要频繁访问数据库的网 ...

  7. Logstash和Flume-NG Syslog接收小测试

    目前在大规模日志处理平台中常见的日志采集器可以采用Logstash或Flume.这两种日志采集器架构设计理念基本相似,都采用采集-过滤处理-输出的方式.下面对这两种采集器Syslog接收性能做个简单测 ...

  8. 【2017-11-19】Linux基础知识:TP-Link WN823N无线网卡(RTL8192EU芯片)的X86-64及AARCH64驱动安装

    目的: 使类似于树莓派的AARCH-64架构的嵌入式设备能通过USB无线网卡连接上以太网: 该设备有LAN接口,但在前一次系统固件升级后,其内部的三个网络接口可以相互ping通,但任一接口无法ping ...

  9. 阿里八八Alapa事后诸葛亮

    设想和目标 1.我们的软件要解决什么问题?是否定义的很清楚?是否对典型用户和典型场景有清晰的描述? 我们的项目希望解决用户对于时间.日程管理上不够方便.直观.易丢失的问题,因为并不是新颖高端的概念,因 ...

  10. 021.13 IO流 RandomAccessFile对象

    对象和方法:RandomAccessFile:文件操作对象,Java提供getFilePointer:获取文件指针 特点:1.只能操作文件2.既能读,又能写3.里面维护了一个数组,内部定义了字符的读和 ...