zoukankan      html  css  js  c++  java
  • 装饰器(续)

    一:函数有用信息

    当我们正常情况下查看函数信息时,可以这样做:

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

    当有装饰器时,此方法就会失效,此时可以这样做:

    from functools import wraps
    
    def deco(func):
        @wraps(func) #加在最内层函数正上方
        def wrapper(*args,**kwargs):
            return func(*args,**kwargs)
        return wrapper
    
    @deco
    def index():
        '''哈哈哈哈'''
        print('from index')
    
    print(index.__doc__)
    print(index.__name__)
    

    二:开放封闭原则
    1.对扩展是开放的

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

    2.对修改是封闭的

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

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

    三:带参数的装饰器

          假如你有成千上万个函数使用了一个装饰器,现在想把这些装饰器都取消掉,此时,有一个简便方法,程序如下:

    def outer(flag):
        def timer(func):
            def inner(*args,**kwargs):
                if flag:
                    print('''执行函数之前要做的''')
                re = func(*args,**kwargs)
                if flag:
                    print('''执行函数之后要做的''')
                return re
            return inner
        return timer
    
    @outer(False)
    def func():
        print(111)
    
    func()
    View Code

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

    def wrapper1(func):       #func=f
        def inner1():
            print('wrapper1 ,before func')
            func()             #f()
            print('wrapper1 ,after func')
        return inner1
    
    def wrapper2(func):      #func=inner1
        def inner2():
            print('wrapper2 ,before func')
            func()            #inner1()
            print('wrapper2 ,after func')
        return inner2
    @wrapper2              #f=wrapper2(f)      inner2=wrapper(inner1)
    @wrapper1              #f=wrapper1(f)       f=inner1
    def f():
        print('in f')
    f()                       #inner2()
    View Code
  • 相关阅读:
    mscrm 2011 iframe中显示关联实体视图
    Microsoft Dynamic CRM 自定义重复检测功能
    sharepoint 在InfoPath中如何获取当前用户的信息(Profile)(转闪电)
    html页面展示语音流
    socketio请求示例
    RPC框架 redkale maven 打包搭建部署教程
    Nexus Repository Manager 3.0 安装与包上传 Maven、Nuget
    使用java代码配置 Spring Boot 中的 Spring Security 和 Rember me, Cookie记住密码
    CentOs 常用命令
    使用springrestdocs 自动生成接口文档
  • 原文地址:https://www.cnblogs.com/leiwei123/p/8418117.html
Copyright © 2011-2022 走看看