装饰器的进阶

  1. 有参装饰器:

    # def warpper(func):
    # def inner(*args,**kwargs):
    # user = input("user:")
    # pwd = input("pwd:")
    # if user == 'alex' and pwd == "dsb":
    # func(*args,**kwargs)
    # return inner
    #
    # @warpper
    # def foo():
    # print("被装饰的函数")
    #
    # foo()

    博客园和码云切换登陆

    # def auth(argv):
    # def warpper(func):
    # def inner(*args,**kwargs):
    # if argv == "博客园":
    # print("欢迎登录博客园")
    # user = input("user:")
    # pwd = input("pwd:")
    # if user == 'alex' and pwd == "dsb":
    # func(*args,**kwargs)
    # elif argv == "码云":
    # print("欢迎登录码云")
    # user = input("user:")
    # pwd = input("pwd:")
    # if user == 'alex' and pwd == "jsdsb":
    # func(*args, **kwargs)
    #
    # return inner
    # return warpper
    #
    # def foo():
    # print("被装饰的函数")
    #
    # msg = input("请输入您要登录的名字:")
    # a = auth(msg)
    # foo = a(foo)
    # foo()
    def auth(x):
    def auth2(func):
    def inner(*args, **kwargs):
    if login_status['status']:
    ret = func()
    return ret if x == 'wechat':
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    if username == '太白' and password == '123':
    login_status['status'] = True
    ret = func()
    return ret
    elif x == 'qq':
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    if username == '太白' and password == '123':
    login_status['status'] = True
    ret = func()
    return ret
    return inner
    return auth2 @auth('wechat')
    def jitter():
    print('记录美好生活') @auth('qq')
    def pipefish():
    print('期待你的内涵神评论') 解题思路:
    @auth('wechat') :分两步:
    ​ 第一步先执行auth('wechat')函数,得到返回值auth2
    ​ 第二步@与auth2结合,形成装饰器@auth2 然后在依次执行。
  2. 多个装饰器装饰一个函数规则:先执行离被装饰函数最近的装饰器

    def wrapper1(func):
    def inner1(*args,**kwargs):
    print("这是装饰器一开始")
    func(*args,**kwargs)
    print("这是装饰器一结束")
    return inner1 def wrapper2(func):
    def inner2(*args,**kwargs):
    print("这是装饰器二开始")
    func(*args,**kwargs)
    print("这是装饰器二结束")
    return inner2 @wrapper1
    @wrapper2
    def func():
    print("这是被装饰的函数") func() 打印结果:
    这是装饰器一开始
    这是装饰器二开始
    这是被装饰的函数
    这是装饰器二结束
    这是装饰器一结束
     def auth(func): # wrapper1装饰器里的 inner
    def inner(*args,**kwargs):
    print("额外增加了一道 锅包肉")
    func(*args,**kwargs)
    print("锅包肉 38元")
    return inner def wrapper1(func): # warpper2装饰器里的 inner
    def inner(*args,**kwargs):
    print("额外增加了一道 日魔刺生")
    func(*args,**kwargs)
    print("日魔刺生 白吃")
    return inner def wrapper2(func): # 被装饰的函数foo
    def inner(*args,**kwargs):
    print("额外增加了一道 麻辣三哥")
    func(*args,**kwargs)
    print("难以下嘴")
    return inner @auth # 1 7
    @wrapper1 # 2 6
    @wrapper2 # 3 5
    def foo(): # 4
    print("这是一个元宝虾饭店")
    小技巧:按v字执行 语法糖拆解:
    foo = wrapper2(foo) # inner = wrapper2(foo)
    foo = wrapper1(foo) # inner = wrapper1(inner)
    foo = auth(foo) # inner = auth(inner)
    foo() # auth里边的inner()

    顺序流程图:

从入门到自闭之python三大器--装饰器进阶的更多相关文章

  1. 从入门到自闭之python三大器--装饰器

    开放封闭原则:在不修改源代码及调用方式,对功能进行额外添加就是开放封闭原则 开放:对代码的扩展进行开发 封闭:修改源代码 装饰(额外功能) 器:工具(函数) 普通版: # print(time.tim ...

  2. 从入门到自闭之Python三大器--生成器

    1.什么是生成器 核心:生成器的本质就是一个迭代器 迭代器是python自带的的 生成器是程序员自己写的一种迭代器 编写方式: 基于函数编写 推导式编写 def func (): print(&quo ...

  3. 从入门到自闭之Python三大器--迭代器

    函数名的第一类对象(概述): 使用方式: 函数名可以当做值赋值给变量 def func(): print(1) print (func) #查看函数的内存地址 a = func print (a) # ...

  4. python三大器(装饰器/生成器/迭代器)

    1装饰器 1.1基本结构 def 外层函数(参数): def 内层函数(*args,**kwargs); return 参数(*args,**kwargs) return 内层函数 @外层函数 def ...

  5. 百万年薪python之路 -- 装饰器进阶

    本文链接:https://blog.csdn.net/xiemanR/article/details/72510885 一:函数装饰函数 def wrapFun(func): def inner(a, ...

  6. Python学习之装饰器进阶

    函数知识回顾: 函数的参数分为:实参和形参. 实参:调用函数的时候传入的参数: 形参:分为3种(位置参数.默认参数.动态传参) 位置参数:必须传值 def aaa(a,b): print(a,b) a ...

  7. Python 入门之 Python三大器 之 装饰器

    Python 入门之 Python三大器 之 装饰器 1.开放封闭原则: (1)代码扩展进行开放 ​ 任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代 ...

  8. Python 入门之 Python三大器 之 生成器

    Python 入门之 Python三大器 之 生成器 1.生成器 (1)什么是生成器? 核心:生成器的本质就是一个迭代器 迭代器是Python自带的 生成器程序员自己写的一种迭代器 def func( ...

  9. Python 入门之 Python三大器 之 迭代器

    Python 入门之 Python三大器 之 迭代器 1.迭代器 (1)可迭代对象: <1> 只要具有__ iter __()方法就是一个可迭代对象 (我们可以通过dir()方法去判断一个 ...

随机推荐

  1. 网络yum源

    1,进入yum源配置目录cd /etc/yum.repos.d 2,备份系统自带的yum源mv CentOS-Base.repo CentOS-Base.repo.bk下载163网易的yum源:wge ...

  2. [CSP-S模拟测试]:Weed(线段树)

    题目描述 $duyege$的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹.为了查出真相,$duyege$准备修好电脑之后再进行一次金坷垃的模拟实验.电脑上面有若干层金坷垃,每次只能在上面撒上一层高度 ...

  3. JavaScript:固定table的表头

    当表格数据很多,以致于容器块元素出现滚动条.而在滚动滚动条的时候,数据行会被块元素遮挡.若要保持表格的head部分始终在可视范围内,我们需要对表头进行特殊的样式设置.下面的jsp代码可以实现表头固定, ...

  4. Amaple.js框架详细介绍

    Amaple · 体验优先的JavaScript单页框架 Amaple (点此查看Github仓库)是专为单页web应用而设计的基于页面模块化的JavaScript框架,它可使开发者快速开发单页web ...

  5. 5 Java 插入排序

    1.基本思想 将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小则依次交换,直到出现比选择元素小的元素或者全部元素都比较过为止. 2.算法描述 ①. 从第一个元素开始,该 ...

  6. CSS、Bulma介绍

    文章目录 一.序章 二.CSS 基础 1. CSS 介绍 2. CSS 语法 3. CSS常用元素 1.颜色 2.字体大小 3.宽高 4.盒模型(单独拿出来讲) 5.背景 4.1样式和内容分离 4.2 ...

  7. [django]update_or_create使用场景

    update_or_create 作用是为了添加数据时防止重复. 先去查询, 如果没有在创建, 如果有则更新. update_or_create用法与密码存储实例 create方法 如果id是None ...

  8. Script Form商业报表程序设计

    Script Form 是SAP所提供的一款强大的报表设设计工具. 一.Script Form主要工具包括如下: 1)Form Painter:格式绘制器,用于格式的设定.TCoce:SE71. 2) ...

  9. 表视图为Group类型的注意问题

    使用group类型的tableview时,第一个section距离navigationbar的距离很大,不符合这边的设计图. 使用 myTableView . sectionHeaderHeight  ...

  10. 【Linux】【三】linux 复制文件到指定目录

    将  application/file/test/logs/ 下的文件 logs.log , logs.tar 复制到  application/file/test/tools/ 下,并新建文件夹[l ...