zoukankan      html  css  js  c++  java
  • Python函数--装饰器进阶

    开放封闭原则

    1.对扩展是开放的

        为什么要对扩展开放呢?

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

      2.对修改是封闭的

        为什么要对修改封闭呢?

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

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

    *args,**kwargs

    def f1(*args,**kwargs):   接收函数的时候,*是聚合

    print(*args)    执行函数值,*是打散

    函数的有用信息

    print(f1.__doc__)获取函数的说明信息

    print(f1.__name__)获取函数的名字

    装饰器已经非常完美了,但是有时我们正常情况下查看函数信息的方法在此处都会失效:

    def index():
        '''这是一个主页信息'''
        print('from index')
    
    print(index.__doc__)    #查看函数注释的方法  ##这是一个主页信息
    print(index.__name__)   #查看函数名的方法  ##index

    如何解决呢? 1 from functools import wraps

     2 
     3 def deco(func):
     4     @wraps(func) #加在最内层函数正上方
     5     def wrapper(*args,**kwargs):
     6         return func(*args,**kwargs)
     7     return wrapper
     8 
     9 @deco
    10 def index():
    11     '''哈哈哈哈'''
    12     print('from index')
    13 
    14 print(index.__doc__)
    15 print(index.__name__)


    '''

    哈哈哈哈
    index

    '''

    装饰器进阶:

    带参数的装饰器:

    flag = True    #带参数的装饰器
    def outer(f):
        def timmer(func):
            def inner(*args,**kwargs):
                if f:
                    print('''执行函数之前要做的''')
                ret = func(*args,**kwargs)
                if f:
                    print('''执行函数之后要做的''')
                return ret
            return inner
        return timmer
    
    @outer(flag)    #等价于@timmer
    def func():
        print(111)
    
    func()
    
    '''
    执行函数之前要做的
    111
    执行函数之后要做的
    '''

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

    def wrapper1(func):    #fun = f
        def inner():
            print('wrapper1 ,before func')
            func()
            print('wrapper1 ,after func')
        return inner
    
    def wrapper2(func):   #func = inner1
        def inner():
            print('wrapper2 ,before func')
            func()
            print('wrapper2 ,after func')
        return inner
    
    @wrapper2      #f = wrapper2(f)里面的f=inner1外面的f=inner2
    @wrapper1       #f = wrapper1(f)  返回inner1   f = inner1
    def f():
        print('in f')
    
    f()   #inner2()
    
    
    '''
    wrapper2 ,before func
    wrapper1 ,before func
    in f
    wrapper1 ,after func
    wrapper2 ,after func
    '''

  • 相关阅读:
    使用Haskell写web
    src/lxml/etree.so: undefined symbol: xmlSchematronSetValidStructuredErrors 解决方案
    CentOS允许某一端口接受外部链接
    windows下的NTP服务
    Huffman树,Huffman编码的实现(C#)
    OpenGL的函数(GLU, GLUT)
    OpenGL的函数(GL)
    GLUT函数说明
    FreeImage使用基础,图像旋转,图像滤波
    Hello PureMVC!!!
  • 原文地址:https://www.cnblogs.com/strive-man/p/8419772.html
Copyright © 2011-2022 走看看