美文网首页python
python装饰器

python装饰器

作者: 苦海飘摇 | 来源:发表于2020-05-09 17:01 被阅读0次
    在python3中 迭代器 生成器 装饰器 理解比较难

    1、装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象,装饰器的本质是函数,主要用来装饰其他函数,也就是为其他函数添加附加功能

    2、装饰器的原则:
    (1) 装饰器不能修改被装饰的函数的源代码
    (2) 装饰器不能修改被装饰的函数的调用方式

    函数

    (1)装饰器的原型

    import time
    def showtime(func):
        def wrapper():
            start_time = time.time()
            func()
            end_time = time.time()
            print('spend is {}'.format(end_time - start_time))
     
        return wrapper
     
    def foo(): #原函数不可以改变
        print('foo..')
        time.sleep(3)
     
    foo = showtime(foo)
    foo()
    

    (2)不带参数的装饰器:(装饰器,被装饰函数都不带参数)

    import time
    def showtime(func):
        def wrapper():
            start_time = time.time()
            func()
            end_time = time.time()
            print('spend is {}'.format(end_time - start_time))
     
        return wrapper
     
    @showtime     #foo = showtime(foo)
    def foo():
        print('foo..')
        time.sleep(3)
     
    @showtime     #doo = showtime(doo)
    def doo():
        print('doo..')
        time.sleep(2)
     
    foo()
    doo()
    
    • 语法:@
    • 装饰器便捷方法在 函数体上方写@showtime 与 foo = showtime(foo)相同

    (3)带参数的被装饰的函数

    import time
    def showtime(func):
        def wrapper(a, b):
            start_time = time.time()
            func(a,b)
            end_time = time.time()
            print('spend is {}'.format(end_time - start_time))
     
        return wrapper
     
    @showtime #add = showtime(add)
    def add(a, b):
        print(a+b)
        time.sleep(1)
     
    @showtime #sub = showtime(sub)
    def sub(a,b):
        print(a-b)
        time.sleep(1)
     
    add(5,4)
    sub(3,2)
    

    (4)带参数的装饰器(装饰函数)

    import time
    def time_logger(flag = 0):
        def showtime(func):
            def wrapper(a, b):
                start_time = time.time()
                func(a,b)
                end_time = time.time()
                print('spend is {}'.format(end_time - start_time))
                
                if flag:
                    print('将此操作保留至日志')
     
            return wrapper
     
        return showtime
     
    @time_logger(2)  #得到闭包函数showtime,add = showtime(add)
    def add(a, b):
        print(a+b)
        time.sleep(1)
     
    add(3,4)
    

    (5)装饰器语法总结

    def myDecorator(...):    #定义装饰器,可能带参数
         def decorator(func):    #装饰器核心,以被装饰的函数对象为参数,返回装饰后的函数对象
             def wrapper(*args, **kvargs):    #装饰的过程,参数列表适应不同参数的函数
                 ...    #修改函数调用前的行为
                 func(*args, **kvargs)    #调用函数
                 ...    #修改函数调用后的行为
             return wrapper
         return decorator
     
    @myDecorator(...):    #给函数加上装饰器
    def myFunc(...):      #自己定义的功能函数
        ...
    
    类 (class)

    Python内置装饰器

    在Python中有三个内置的装饰器,都是跟class相关的:staticmethod、classmethod 和property。

    • staticmethod 是类静态方法,其跟成员方法的区别是没有 self 参数,并且可以在类不进行实例化的情况下调用
    • classmethod 与成员方法的区别在于所接收的第一个参数不是 self (类实例的指针),而是cls(当前类的具体类型)
    • property 是属性的意思,表示可以通过通过类实例直接访问的信息
    import time
    class Foo(object):
        def __init__(self, func):
            self._func = func
     
        def __call__(self):
            start_time = time.time()
            self._func()
            end_time = time.time()
            print('spend is {}'.format(end_time - start_time))
     
    @Foo  #bar = Foo(bar)
    def bar():
        print('bar..')
        time.sleep(2)
     
    bar()
    

    相关文章

      网友评论

        本文标题:python装饰器

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