开放封闭原则:

  • 开放对扩展
  • 封闭修改源代码
  • 改变了人家调用方式

装饰器结构

"""
默认结构为三层!!!每层返回下一层内存地址就可以进行执行函数,
传参:语法糖中的传参可以在地二层中进行判断传入。
     第一层:传送语法糖中的参数
     第二层:传送外部函数的名称
     第三层:传送外部函数的参数
被装饰器装饰的函数名即使没有被调用(因为有@xxx,会触发运行装饰器),
(装饰器工厂函数)定义装饰器的代码已经运行了(最内部的那个函数并没有运行),
(把被装饰的原函数引用赋值给了装饰器内部的那个函数名),当下边通过该函数名调用时,
会调用到装饰器内部的那个函数()
装饰器:在不修改函数源代码的基础上,添加函数功能
"""
def Wrapper(*args,**kwargs): #获取`@Wrapper(args)`传入参数
    def Outter(func_name): #获取装饰器所装饰函数的名称
        def Inner(*args,**Kwargs): #获取`def func(*args,**kwargs):`的传入参数
            ret = func_name(*args,**kwargs) #执行装饰器所装饰的函数
            return ret #将返回值传给被装饰的函数
        return Inner #返回`Inner`的内存地址,方便调用
    return Outter #返回`Outter`的内存地址,方便调用

@Wrapper(args) #`func = Outter(func) = Wrapper(args)`装饰器进行传参
def func(*args,**kwargs): #定义被装饰函数
    return func.__name__ #定义函数返回值    

返回装饰器的被装饰函数名

from functools import wraps
def warpper(f):
    @wraps(f)   #显示被装饰的函数
    def inner(*args,**kwargs):
        # print(f.__name__)
        print(f)
    return inner  #
def aa():
    print(1)
aa = warpper(aa)
print(aa.__name__)  # 显示被装饰的函数名

账户认证(简易版)

def Wrapper(auth_type): #默认使用Wrapper名称,获取语法糖的参数
    def Outer(func_name): #获取传入参数的名称
        def file(*args,**kwargs): #获取传入参数的参数
            print('这是在file函数中')
            ret = func_name(*args,**kwargs)
            print('file函数装饰完毕')
            return ret
        def net(*args,**kwargs):
            print('这个是在网络函数中')
            ret = func_name(*args,**kwargs)
            print('网络函数执行结束')
            return ret
        if auth_type == 'localfile': #对传入参数进行判断返回不同结果
            return file
        elif auth_type == 'net':
            return net
        else:
            print('该函数没有被装饰')
    return Outer

@Wrapper(auth_type='net') #语法糖进行传参
def Login(username):
    print(f'Welcome {username} Login.')

Login('longlong') #大神登陆啦!

Wrapper的更多相关文章

  1. gradlew wrapper使用下载到本地的gradle.zip文件装配--转

    原文地址:http://www.myexception.cn/mobile/1860089.html gradlew wrapper使用下载到本地的gradle.zip文件安装.使用gradlew来b ...

  2. Could not find or load main class org.gradle.wrapper.GradleWrapperMain解决办法

    解决办法: gradlew is the gradle wrapper executable - batch script on windows and shell script elsewhere. ...

  3. 使用Windows Service Wrapper快速创建一个Windows Service

    前言 今天介绍一个小工具的使用.我们都知道Windows Service是一种特殊的应用程序,它的好处是可以一直在后台运行,相对来说,比较适合一些需要一直运行同时不需要过多用户干预的应用程序,这一类我 ...

  4. Java Service Wrapper简介与使用

    在实际开发过程中很多模块需要独立运行,他们并不会以web形式发布,传统的做法是将其压缩为jar包独立运行,这种形式简单易行也比较利于维护,但是一旦服务器重启或出现异常时,程序往往无法自行修复或重启.解 ...

  5. [转] 基于PHP Stream Wrapper开发有趣应用场景

    PHP Stream Wrapper 原文:http://blog.sina.com.cn/s/blog_502c8cc40100k40e.html ,主要是基于SAE环境讲述相应的应用场景,本文经过 ...

  6. wrapper for lua

    考虑使用已经有的dll,要写wrapper,使得在lua中能调用dll里的函数,嗯,参考<Programming in lua>,然后仿写luars232. 一.函数定义 先分析一个函数的 ...

  7. 使用 Java Service Wrapper 启动java后台进程服务

    Java Service Wrapper (http://wrapper.tanukisoftware.com/doc/english/product-overview.html)可以很方便得在各个平 ...

  8. file_get_contents()获取https出现这个错误Unable to find the wrapper “https” – did

    file_get_contents()获取https出现这个错误Unable to find the wrapper “https” – did 解决办法 ,如果你是用的服务器,可以参考这个办法,修改 ...

  9. Simplified CommonJS wrapper 与 AMD 标准定义模块差异

    标准的 AMD 模块定义 一个标准的 AMD 模块看起来是这样子: define(['foo', 'foo/bar'], function (foo, bar) { return { doSometh ...

  10. java service wrapper 级别为info导致内存剧增直至溢出

    上周,公司某一环境发生java service wrapper内存剧增导致最后被自动killed的情况,经过分析,确定导致java service wrapper(后续简称wrapper)守护进程内存 ...

随机推荐

  1. python-django rest framework框架之序列化

    序列化与反序列化: 对象 -> 字符串 序列化 字符串 -> 对象 反序列化 rest framework序列化+Form 目的: 解决QuerySet序列化问题 功能:解析 和 过滤 - ...

  2. 借助python工具从word文件中抽取相关表的定义,最后组装建表语句-非常好

    借助python工具从word文件中抽取表的定义,最后组装建表语句-非常好 --如有转载请以超链接的方式注明原文章出处,谢谢大家.请尊重每一位乐于分享的原创者 1.python脚本 ## -*- co ...

  3. [LeetCode] 201. Bitwise AND of Numbers Range ☆☆☆(数字范围按位与)

    https://leetcode.com/problems/bitwise-and-of-numbers-range/discuss/56729/Bit-operation-solution(JAVA ...

  4. python(6)之文件

    一.读写文件 以追加文件内容(a).读(r).写(w),读写(r+)的形式打开文件: f = open('yesterday','a',encoding='utf-8')#文件句柄 #输出一行文件内容 ...

  5. Docker私有仓库介绍

    安装环境 Centos 7.4 64位 安装Docker yum install docker 说明:docker新版本的安装方式和以前不一样,这里只是为了能运行Harbar, 不展开. 安装Dock ...

  6. js中如何返回一个存放对象的数组?

    我这边需要返回后台数据的形式是这样的 {[ { ", }, { ", }, { ", }, { ", }, { ", } ]} 页面是通过循环去获取每 ...

  7. zhuan 常用图像数据集:标注、检索

      目录(?)[+]   1.搜狗实验室数据集: http://www.sogou.com/labs/dl/p.html 互联网图片库来自sogou图片搜索所索引的部分数据.其中收集了包括人物.动物. ...

  8. AdaBoost, LogitBoost and GradientBoosting

    前向分步算法与加法模型(forward stagewise algorithm and additive model) (1) AdaBoost:前向分步算法中损失函数取指数损失函数 (2) Logi ...

  9. windows 路由的配置

    查看ip路由表 route print : netstat -r windows 下添加一条路由 route命令 route [-f][-p][command [distinataion] [MASK ...

  10. ECMAscript5中的map

    今天看到到这样一个问题: ["1", "2", "3"].map(parseInt) 执行结果是什么? 结果是[1,NAN,NAN],很出乎 ...