Python全栈之路系列之装饰器

作者: 2890bd62c72a | 来源:发表于2019-10-09 14:45 被阅读0次

    装饰器是由函数去生成的,用于装饰某个函数或者方法或者类,他可以让这个函数在执行之前或者执行之后做一些操作。

    实例

    先定义一个函数func

    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    
    def func(arg):  # 接受一个参数arg
        print(arg)  # 输出这个参数
    
    func("Hello World!")  # 调用脚本并且传入参数
    

    执行脚本,输出的结果为:

    C:\Python35\python.exe F:/Python_code/Note/装饰器.py
    func
    
    Process finished with exit code 0
    

    现要在执行func这个函数前后执行一些操作,就可以创建一个装饰器来实现:

    在学习过程中有什么不懂得可以加我的
    python学习交流扣扣qun,784758214
    群里有不错的学习视频教程、开发工具与电子书籍。
    与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    
    def decorator(func):  # 创建一个装饰器函数,接受的参数arg参数就是func函数名
    
        def inner(*args, **kwargs):
            print("执行函数之前")
            ret = func(*args, **kwargs)
            print("执行函数之后")
            return ret
    
        return inner
    
    @decorator  # 如果要让某个函数使用装饰器,只需要在这个函数上面加上@+装饰器名
    def func(arg):
        print(arg)
    
    func("Hello World!")
    

    输出结果为:

    /usr/bin/python3.5 /home/ansheng/Documents/PycharmProjects/blogcodes/装饰器.py
    执行函数之前
    Hello World!
    执行函数之后
    
    Process finished with exit code 0
    

    多个装饰器装饰同一个函数

    #!/usr/bin/env python
    # _*_ coding: utf-8 _*_
    
    def decorator1(func):
        def inner():
            print("开始之前执行装饰器01")
            ret = func()
            print("结束之后执行装饰器01")
            return ret
    
        return inner
    
    def decorator2(func):
        def inner():
            print("decorator2>>>Start...")
            ret = func()
            print("decorator2>>>End...")
            return ret
    
        return inner
    
    @decorator1
    @decorator2
    def index():
        print("执行函数...")
    
    index()
    

    输出结果:

    /usr/bin/python3.5 /home/ansheng/Documents/PycharmProjects/blogcodes/装饰器.py
    开始之前执行装饰器01
    decorator2>>>Start...
    执行函数...
    decorator2>>>End...
    结束之后执行装饰器01
    
    Process finished with exit code 0
    

    更多实例

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    # Created by 安生 on 2017/2/9
    
    """
    函数装饰器
    """
    
    def decorator(func):
        def wrapped(*args, **kwargs):
            return func(*args, **kwargs)
    
        return wrapped
    
    @decorator
    def func(a, b):
        return a + b
    
    print(func(1, 2))
    """
    类装饰器
    """
    
    class decorator:
        def __init__(self, func):
            self.func = func
    
        def __call__(self, *args, **kwargs):
            return self.func(*args, **kwargs)
    
    @decorator
    def func(a, b):
        return a + b
    
    print(func(1, 2))
    """
    带参数的函数装饰器
    """
    
    def parameter(a, b):
        print(a, b)
    
        def decorator(func):
            def wrapped(*args, **kwargs):
                return func(*args, **kwargs)
    
            return wrapped
    
        return decorator
    
    @parameter(1, 2)
    def func(a, b):
        return a + b
    
    print(func(10, 20))
    """
    带参数的类装饰器
    """
    
    def parameter(a, b):
        print(a + b)
    
        class decorator:
            def __init__(self, func):
                self.func = func
    
            def __call__(self, *args, **kwargs):
                return self.func(*args, **kwargs)
    
        return decorator
    
    @parameter(1, 2)
    def func(a, b):
        return a + b
    
    print(func(10, 20))
    
    """
    带参数的类装饰器
    """
    
    def parameter(a, b):
        print(a, b)
    
        def decorator(cls):
            class wrapped:
                def __init__(self, *args, **kwargs):
                    self.cls = cls(*args, **kwargs)
    
                def __getattr__(self, item):
                    return getattr(self.cls, item)
    
            return wrapped
    
        return decorator
    
    @parameter(1, 2)
    class CLS:
        def __init__(self):
            self.a = 'a'
    
        def P(self, v):
            print(v)
    
    obj = CLS()
    print(obj.a)
    obj.P('Hello,')
    
    """
    为函数中和类中的方法添加装饰器
    """
    
    def Call(aClass):
        calls = 0
    
        def onCall(*args, **kwargs):
            nonlocal calls
            calls += 1
            print('call %s to %s' % (calls, func.__name__))
            return aClass(*args, **kwargs)
    
        return onCall
    
    @Call
    def func(a, b):
        return a + b
    
    print(func(1, 2))
    
    class CLS:
        def __init__(self):
            self.a = 'a'
    
        @Call
        def b(self):
            return self.a
    
    obj = CLS()
    print(obj.b())
    

    如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的!交流经验!自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

    相关文章

      网友评论

        本文标题:Python全栈之路系列之装饰器

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