吾八哥博客

您现在的位置是:首页 > 码农手记 > Python > 正文

Python

吾八哥学Python(十七):Python里的装饰器

吾八哥2017-08-09Python3448

这篇Python里的装饰器学习的文章很早之前就想写了,但由于各种原因,各种懒惰拖拉,导致一直都没动手!装饰器(decorator)是一种高级Python语法,通俗点说装饰器的目的就是为给某个现有的函数功能补充的作用。具体的更详细的解释可以网上各种搜索,非常多的资料,今天我在这里只做下自己学习的笔记!

简单装饰器

现在有如下代码:

def test1():
    print("test1...")

def test2(a):
    print("test2...")

if __name__ == '__main__':
    test1()
    test2()

假如在使用的过程中,出现这种情况,出现了某个偶现的错误需要写日志,或者调用test1或者test2方法之前都需要先调用另一个方法才能执行下去,那么这个时候我们肯定首先想到的是在这俩函数里分别加下日志或者加上对应的方法就行了,那么这样的话就需要修改这俩函数了,但Python里有了装饰器,咱就不用这么做了,装饰器可以简单的帮咱完成这个事情,来看看具体的实现方法:

def writelog(func):
    def wrapper():
        print("[log]func:{}".format(func.__name__))
        return func()
    return wrapper

@writelog
def test1():
    print("test1...")

@writelog
def test2():
    print("test2...")

if __name__ == '__main__':
    test1()
    test2()

上述代码运行结果为:

[log]func:test1
test1...
[log]func:test2
test2...

带参数的函数装饰器

上面是函数无参数的时候的装饰器的实现方法,假如函数有参数,那么上面的实现方式就无效了,来看看带参数的函数的装饰器的实现方法:

def writelog(func):
    def wrapper(*args, **kwargs):
        print("[log]func:{}".format(func.__name__))
        return func(*args, **kwargs)
    return wrapper

@writelog
def test1(a):
    print("test1...", a)

@writelog
def test2(a, b):
    print("test2...", a, b)

if __name__ == '__main__':
    test1(10)
    test2(9, 7)

装饰器函数加参数

还有一种情况就是假如装饰器函数也需要参数呢?例如上面的writelog函数要加参数,那么写法就如下了:

def writelog(text):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print("[log]func:{},text:{}".format(func.__name__,text))
            return func(*args, **kwargs)
        return wrapper
    return decorator

@writelog("1")
def test1(a):
    print("test1...", a)

@writelog("2")
def test2(a, b):
    print("test2...", a, b)

if __name__ == '__main__':
    test1(10)
    test2(9, 7)

类装饰器

类的装饰器的实现方法是重载__call__方法,具体如下:

class Test():
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print("call...")
        print("[log]func:{}".format(self.func.__name__))
        return self.func(*args, **kwargs)
def log(text):
    print('log:', text)

t = Test(log)
t('测试的日志信息')

好了,这里只是比较浅显的学习一下Python里的装饰器,后面还是得多多深入理解一下装饰器的的。

本文首发学Python网:http://www.xuepython.wang