美文网首页
Python装饰器

Python装饰器

作者: Aresx | 来源:发表于2019-07-11 17:52 被阅读0次

    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装饰器

          本文链接:https://www.haomeiwen.com/subject/sktjkctx.html