Python装饰器

Python装饰器

装饰器作用

  • 装饰器可也用来扩展函数或者类的功能,在不改变原有主体函数或类的情况下,简便的为其扩展功能。
  • 因为装饰器内功能调用在主体前,所以可以拦截主体函数调用或拦截主体类创建实例,并且处理它们。

函数装饰器

一个简单的装饰器,没有任何意义,仅是展示装饰器的用法。

def my_decorator(func):
    def wrapper():
        print("warpper")
        return func()

    print("my_decorator")
    return wrapper


@my_decorator
def show():
    print("show")


show()
print("函数名:%s" % show.__name__)

输出:

my_decorator
warpper
show
函数名:wrapper

这其中有一个问题,show()函数的名字已经改变,因为在装饰器中返回的是包装过的wrapper(*args, **kwargs)函数。如果要解决这个问题,可以引入官方包import functools,代码如下:

import functools


def my_decorator(func):
    @functools.wraps(func)
    def wrapper():
        print("warpper")
        return func()

    print("my_decorator")
    return wrapper


@my_decorator
def show():
    print("show")


show()
print("函数名:%s" % show.__name__)

输出:

my_decorator
warpper
show
函数名:show

可以看到函数名已经回复正常。一般装饰器的使用都会是对原有函数进行功能扩充,所以原函数有参的话也可以传入装饰器。两个整数加法,如不是整数提示错误。

import functools


def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        for i in range(len(args)):
            if not isinstance(args[i], int):
                print("输入错误,请输入整数")
                return
        return func(*args, **kwargs)

    return wrapper


@my_decorator
def add(x, y):
    print("加法结果:%d" % (x + y))


add(11, 22)

类装饰器

可以为一个类添加装饰器,不改变类原有代码的情况下,为类添加或修改属性,也可以为类增加函数。

import functools


def my_decorator(cls):
    def show():
        print("新加入函数")

    @functools.wraps(cls)
    def wrapper():
        cls.name = "张三"
        cls.age = 20
        cls.show = show
        return cls

    return wrapper


@my_decorator
class A:
    def __init__(self):
        self.name = "小明"
        print("init")


a = A()
print(a.age)
print(a.name)
a.show()

输出:

20
张三
新加入函数

Adef __init__(self)并没有执行,已经被装饰器拦截。装饰器为A添加了属性和函数。

初学python,如对知识点理解有误还请指正。欢迎补充不足之处,看到后我会及时补充进文章中。

你可能感兴趣的:(Python装饰器)