python 参数化装饰器

葫芦的运维日志

下一篇 搜索 上一篇

2018/09/13 01:21


类装饰器:

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

 

 

葫芦的运维日志

打赏

上一篇 搜索 下一篇
© 冰糖葫芦甜(bthlt.com) 2019 王梓 打赏联系方式 陕ICP备17005322号