python 参数化装饰器

类装饰器:

#!/usr/bin/env python
# coding=utf-8
# author: wz
# mail: 277215243@qq.com
# datetime:2019/3/10 2:24 AM
# web: https://www.bthlt.com


class Log():
    def __init__(self, func):
        print('start init')
        self.func = func

    def __call__(self, *args, **kwargs):
        print('start call')
        self.func()



@Log
def test():
    import time
    print('test')
    for i in range(3):
        print i
        time.sleep(1)


test()

"""
start init
start call
test
0
1
2
"""

函数装饰器: 

[root@wangzi py]# cat repeat.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def repeat(number=3):
    """多次重复执行装饰函数,
    返回最后一次原始函数调用的值作为结果。
    :param number: 重复次数,默认值是3
    """
    def actual_decorator(function):
        def warpper(*args,**kwargs):
		result = None
		for _ in range(number):
			result = function(*args,**kwargs)
		return result
	return warpper
    return actual_decorator

@repeat(2)
def foo():
    print('foof')
foo()

@repeat()
def bar():
    print('bar')
bar()
[root@wangzi py]# python repeat.py
foof
foof
bar
bar
bar

闭包函数

什么函数可以被称为闭包函数呢?主要是满足两点:函数内部定义的函数;引用了外部变量但非全局变量。

python装饰器

  有了闭包函数的概念,我们再去理解装饰器会相对容易一些。python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解:

    实质: 是一个函数

    参数:是你要装饰的函数名(并非函数调用)

    返回:是装饰完的函数名(也非函数调用)

    作用:为已经存在的对象添加额外的功能

    特点:不需要对对象做任何的代码上的变动

python装饰器有很多经典的应用场景,比如:插入日志、性能测试、事务处理、权限校验等。装饰器是解决这类问题的绝佳设计。并且从引入中的列子中我们也可以归纳出:装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python爬虫与数据挖掘

运行Scrapy程序时出现No module named win32api问题的解决思路和方法

有小伙伴在群里边反映说在使用Scrapy的时候,发现创建项目一切顺利,但是在执行Scrapy爬虫程序的时候却出现下列报错:“No module named wi...

13610
来自专栏Python爬虫与数据挖掘

用Python在知乎看美女,是一种怎么样的体验?

本月将更新八篇Python有趣系列文章。本系列通过多个有趣案例,讲解Python的玩法,其中包含如下内容,一一推进讲解。

49650
来自专栏AI科技大本营的专栏

国内少儿眼中的编程:“Coding即是代码”?

【编者按】上一个时代流行从小学奥数,现在“编程要从宝宝抓起”已经开始疯狂流行。随着 2017 年国务院印发《新一代人工智能发展规划》,鼓励实施全民只能教育项目,...

10510
来自专栏AI科技大本营的专栏

75道常见AI面试题,看看你的知识盲点在哪?(附解析)

【导语】正值求职、跳槽季,无论你是换工作还是找实习,没有真本事都是万万不行的,可是如何高效率复习呢?之前我们给大家推荐了一份 Python 面试宝典,收藏了近 ...

34830
来自专栏华章科技

干货:可视化项目实战经验分享,轻松玩转Bokeh(建议收藏)

导读:本文通过一个项目案例,详细的介绍了如何从 Bokeh 基础到构建 Bokeh 交互式应用程序的过程,内容循序渐进且具有很高的实用性。本文共有两万字左右,属...

14720
来自专栏机器之心

PyTorch进阶之路(一):张量与梯度

本系列教程旨在让用户更好地利用 PyTorch 学习深度学习和神经网络。本文将介绍 PyTorch 模型的基本构件:张量和梯度。

14020
来自专栏华章科技

Python VS R,到底该怎样选择?3张长图给你最详细的解答

导读:想知道做数据分析应该使用R还是Python?事实证明,很多好资源可以帮助你了解这两种语言的优缺点。

10310
来自专栏机器之心

Jupyter可能并非理想的Notebook

据报道,Jupyter notebook 是数据科学家首选的实战工具。本文展示了从 EDA(探索性数据分析)到API 的快节奏,并没有Jupyter。 Jup...

12120
来自专栏轮子工厂

如何大规模拼接字符串?(含中奖名单)

月初公众号上给大家送了10本书,有5本是用抽奖助手抽的,大家可以在抽奖助手上查看。

9520
来自专栏AI科技大本营的专栏

都有Python了,还要什么编译器!

诚然,编译器可以为你生成高性能的代码,但是你真的需要编译器吗?另一种方法是用 Assembly 编写程序,虽然有点夸大,但这种方法有两个主要缺陷:

29520

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励