zoukankan      html  css  js  c++  java
  • python基础 装饰器

    装饰器

    装饰器的作用:
          不想修改函数的调用方式,但是还想在原来的函数添加功能
          timmer 就是一个装饰器函数,只是对一个函数 有一些装饰作用

    import time    #import  调用模块
    time.sleep(5)    #让程序在执行到这个位置的时候停一会
    print('哈哈哈')
    time.time()  #获取当前时间
    @timmer            #语法糖
    
    def timmer(f):
        start = time.time()
        f()
        end = time.time()
        print(end - start)
    
    def func():
        #start = time.time()
        time.sleep(0.01)
        print('')
        #end = time.time()
        #print(end - start)
    timmer(func)
    
    
    
    def func():
        time.sleep(0.01)
        print()
        
    def timmer(func):
        def inner():
            start = time.time()
            func()
            end  = time.time()
            print(end - start)
        return inner
    func = timmer(func)
    func()
    import time
    def timmer(f):   #装饰器函数
        def inner(a):
            start = time.time()
            ret = f(a)   #被装饰的函数
            end = time.time()
            print(end - start)
            return ret
        return inner
    @timmer     #语法糖
    def func(a):
        time.sleep(0.01)
        print('',a)
        return '新年好'
    #func = timmer(func)
    ret = func(1)
    print(ret)

    开放封闭原则

      1.对扩展是开放的

        为什么要对扩展开放呢?

        我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

      2.对修改是封闭的

        为什么要对修改封闭呢?

        就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

    装饰器完美的遵循了这个开放封闭原则。

    装饰器的固定模式

    def outer():
        def inner():
            return 'inner'
        inner()
    outer()
    #装饰器的固定格式——wraps版
    from functools import wraps
    
    def deco(func):
        @wraps(func) #加在最内层函数正上方
        def wrapper(*args,**kwargs):
            return func(*args,**kwargs)
        return wrapper

    装饰带参数函数的装饰器

    def wrapper(f):   #装饰器函数,f是被装饰的函数
        def inner(*args,**kwargs):
            '''在被装饰函数之前要做的事情'''
            ret = f(*args,**kwargs) #被装饰的函数
            '''在被装饰函数之后要做的事情'''
            return ret
        return inner
    @wrapper        #语法糖 @装饰器函数名
    def func(a,b)        #被装饰的函数
        time.sleep(0.01)
        print('sole')
        return'sole'
    def wrapper(f):
        def inner(*args,**kwargs):
            ret = f(*args,**kwargs)
            return ret
        return inner
    
    @wrapper
    def qqxing():
        print(123)
    ret = qqxing()
     
  • 相关阅读:
    (C/C++学习笔记) 五. 常变量(只读变量)和宏
    (C/C++学习笔记) 四. 运算符
    (C/C++学习笔记) 三. 作用域和可见性
    (C/C++学习笔记) 一. 基础知识
    计算机科学的基本术语及其英语表达
    模块与包
    Python的递归
    内置函数与匿名函数
    装饰器,迭代器,生成器分析
    命名关键字参数,函数对象,嵌套,名称空间与作用域,闭包
  • 原文地址:https://www.cnblogs.com/soleZ/p/8135876.html
Copyright © 2011-2022 走看看