博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 装饰器笔记
阅读量:5981 次
发布时间:2019-06-20

本文共 3385 字,大约阅读时间需要 11 分钟。

一、装饰器无参数

1.原函数无参数

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

 

2.原函数带参数

def wrap_in_tag_b(fn):    def wrapped(arg): # arg 是原函数参数        return "" + fn(arg) + ""    return wrappeddef wrap_in_tag_i(fn):    def wrapped(arg): # arg 是原函数参数        return "" + fn(arg) + ""    return wrapped@wrap_in_tag_b@wrap_in_tag_idef 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}
".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}
".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}
".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}
".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}
".format(deco_arg, func(func_arg)) return wrapped return 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_arg            def __call__(self, func):        def newf(slf, func_arg): # slf必须!self被占用了,那就给第一个参数另一个名字slf(随便)            return "<{0}>{1}
".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'))
 

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

你可能感兴趣的文章
交互设计[3]--点石成金
查看>>
SCCM TP4部署Office2013
查看>>
redis主从配置<转>
查看>>
bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...
查看>>
利用console控制台调试php代码
查看>>
讲解sed用法入门帖子
查看>>
Linux 内核已支持苹果
查看>>
shell脚本逻辑判断,文件目录属性判断,if,case用法
查看>>
【二叉树系列】二叉树课程大作业
查看>>
ASP.NET Core 2 学习笔记(三)中间件
查看>>
hbase region split源码分析
查看>>
MySQL备份之分库分表备份脚本
查看>>
Java 与 Netty 实现高性能高并发
查看>>
SurfControl人工智能新突破 领跑反垃圾邮件
查看>>
一个动态ACL的案例
查看>>
openstack 之 windows server 2008镜像制作
查看>>
VI快捷键攻略
查看>>
httpd的manual列目录漏洞
查看>>
漫谈几种反编译对抗技术
查看>>
Timer 和 TimerTask 例子
查看>>