一、补充:nonlocal关键字

1、作用:将L与E(E中的名字需要提前定义)的名字统一

2、应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值

3、案例:

def outer():
         num = 10
         print(num) # 10
         def inner():
               nonlocal num
               num = 20
               print(num) # 20
         inner()
         print(num) # 20

二、装饰器的原则:

开放封闭原则:不改变调用函数方式与源代码的情况下增加新功能

1、不能修改被装饰对象(函数)的源代码(封闭)

2、不能更改被修饰对象(函数)的调用方式,并且能达到增加新功能的效果(开放)

三、装饰器

1、原理:

# 把要被装饰的函数作为外层函数的参数通过闭包操作后返回一个替代版函数
# 被装饰的函数:fn
# 外层函数:outer(func) outer(fn) => func = fn
# 替代版函数: return inner: 原功能+新功能

2、例:

def fn():
    print("原有功能")

# 装饰器
def outer(tag):
      def inner():
            tag()
            print(新增功能")
       return inner
fn = outer(fn)
fn()

四、@语法糖:@外层函数

例:

def outer(f):
       def inner():
             f()
             print("新增功能1")
        return inner

def wrap(f):
       def inner():
             f()
             print("新增功能2")
        return inner

@wrap # 被装饰的顺序决定了新增功能的执行顺序(先装饰)
@outer # <==> fn = outer(fn): inner                           (后装饰)
def fn():
       print("原有功能")

五、有参有返的函数别装饰

例:

def check_usr(fn):            # fn, login, inner:不同状态下的login,所以参数是统一的
         def inner(usr, pwd):
         # 在原功能上添加新功能
                   if not (len(usr) >= 3 and usr.isalpha()):
                   print('账号验证失败')
                   return False
                   # 原有功能
                   result = fn(usr, pwd)
                   # 在原功能下添加新功能
                   # ...
                   return result
        return inner

@check_usr
def login(usr, pwd):
          if usr == 'abc' and pwd =='123qwe':
                    print('登录成功')
                    return True
          print('登录失败')
          return False

小结:1、login有参数,所以inner与fn都由相同的参数

2、longin有返回值,所以inner与fn都由返回值

六、装饰器的最终写法:

例:

def wrap(fn):
       def inner(*args, **kwargs):
              print('前增功能')
              result = fn(*args, **kwargs)
              print('后增功能')
              return result
         return inner

@wrap
def fn1():
        print('fn1的原有功能')
@wrap
def fn2(a, b):
        print('fn2的原有功能')
@wrap
def fn3():
       print('fn3的原有功能')
       return True
@wrap
def fn4(a, *, x):
       print('fn4的原有功能')
       return True

fn1()
fn2(10, 20)
fn3()
fn4(10, x=20)

七、带参装饰器

def outer(input_color):
           def wrap(fn):
                 if input_color == 'red':
                      info = '\033[36;41mnew action\33[0m'
                 else:
                       info = 'yellow:new action'

def inner(*args, **kwargs):
                          pass
                          result = fn(*args, **kwargs)
                           print(info)
                           return result
                 return inner
           return wrap # outer(color) => wrap

color = input('color: ')
@outer(color) # @outer(color) ==> @wrap # func => inner
def func():
       print('func run')

func()

八、案例:登入认证功能

is_login = False # 登录状态

def login():
        usr = input('usr: ')
        if not (len(usr) >= 3 and usr.isalpha()):
               print('账号验证失败')
               return False
         pwd = input('pwd: ')
         if usr == 'abc' and pwd =='123qwe':
                 print('登录成功')
                 is_login = True
         else:
                 print('登录失败')
                 is_login = False

# 完成一个登录状态校验的装饰器
def check_login(fn):
          def inner(*args, **kwargs):
# 查看个人主页或销售功能前:如果没有登录先登录,反之可以进入其功能
                  if is_login != True:
                         print('你未登录')
                         login()
# 查看个人主页或销售
                  result = fn(*args, **kwargs)
                  return result
           return inner

# 查看个人主页功能
@check_login
def home():
         print('个人主页')

# 销售功能
@check_login
def sell():
        print('可以销售')

home()

DAY12、装饰器的更多相关文章

  1. day12:装饰器的进阶

    1,三元运算符:变量 = 条件返回True的结果 if 条件 else 条件返回false的结果:必须要有结果:必须要有if和else,只能是简单的情况. 2,传参包起来,星号打散 def outer ...

  2. day12 装饰器的模版

    1.什么是装饰器 装饰器指的是为被装饰对象(别人)添加新功能的工具 装饰器本身可以是任意可调用对象 被装饰器对象也可以是任意可调用对象 2.为何要用装饰器 开放封闭原则:指的是对修改封闭,对扩展开放 ...

  3. 总结day12 ----装饰器

    一,什么是装饰器? 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用场景:比如插入日志,性能测试,事 ...

  4. Day12装饰器

    1.装饰器 什么是装饰器:装饰器指的是为被装饰对象添加新功能的工具 装饰器本身可以是任意调用对象 被装饰对象本身也可以是任意可调用对象 2.为何要用装饰器: 开放封闭原则: ①对修改源代码和调用方式是 ...

  5. day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)

    day11:装饰器(装饰器形成.装饰器作用.@语法糖.原则.固定模式) 装饰器形成:最简单的.有返回值的.有一个参数的.万能参数 函数起的作用:装饰器用于在已经完成的函数前后增加功能 语法糖:使代码变 ...

  6. Python——day12 nonlcoal关键字、装饰器(开放封闭原则、函数被装饰、最终写法)

    一.nonlocal关键字 1.作用:将L与E(E中的名字需要提前定义)的名字统一 2.应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值 def outer(): num=10 print ...

  7. day12 十二、开放封闭、装饰器

    一.nonlocal关键词 # global # num = # def fn(): # global num # L>G 将局部的名字与全局统一 # num = # fn() # print( ...

  8. python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)

    函数的执行时,*打散.函数的定义时,*聚合. from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(* ...

  9. 函数的有用信息,装饰器 day12

    一 函数的有用信息 本函数的功能:绘图功能,实时接收数据并绘图.:return: 绘图需要的数据,返回给前端某标签 def f1(): ''' 本函数的功能:绘图功能,实时接收数据并绘图. :retu ...

随机推荐

  1. O(n*logn)级别的算法之二(快速排序)的三种实现方法详解及其与归并排序的对比

    一,单路快排1.测试用例: #ifndef INC_06_QUICK_SORT_DEAL_WITH_NEARLY_ORDERED_ARRAY_SORTTESTHELPER_H #define INC_ ...

  2. 01-html介绍和head标签

    [转]01-html介绍和head标签 主要内容 web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 HTML规范 HTML结构详解 一.web标准 web准备介绍: w3c:万维网 ...

  3. C#网络请求与JSON解析

    最新学校的海康摄像头集控平台(网页端)不能在win10里登录,我寻思着拿海康的c# demo直接改. 首先得解决权限问题,每个教师任教不同年级,只能看到自己所在年级的设备,涉及到登录,在此记录一下C# ...

  4. whistle

    whistle介绍 whistle是基于Node的跨平台web调试代理工具, 主要查看, 修改HTTP, HTTPS, Websocket的请求,响应, 也可以作为HTTP代理服务器使用 (文档)[h ...

  5. 前后端分离djangorestframework—— 接入支付宝支付平台

    支付宝 简介 支付宝是什么不用多说了,本次教程适合初学者 前提准备 话不多说,干就完了 1.注册开发者账号,设置公钥私钥 首先进入支付宝开发者平台:传送门 ,有账号直接登录,没账号用你平时用来付款收钱 ...

  6. memset的用法

    memset的功能是将一块内存中的内容以单个字节逐个拷贝的方式放到指定的内存中去. 如memset(dp,0,sizeof(dp))其中dp为一个int型数组,因为int为4个字节,那么每一个字节的位 ...

  7. hadoop 分析

    Hadoop源代码分析(一) Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http://research.goo ...

  8. Bootstrap Multiselect插件使用步骤以及常见参数配置介绍

    Multiselect是基于jQuery插件的,它可以以下拉列表的形式为用户提供选择内容,能进行单选或者多选.它应用的主要步骤如下: 一,引入需要的相关js和css文件 既然是Bootstrap插件, ...

  9. 如何用Nginx解决前端跨域问题?

    前言 在开发静态页面时,类似Vue的应用,我们常会调用一些接口,这些接口极可能是跨域,然后浏览器就会报cross-origin问题不给调. 最简单的解决方法,就是把浏览器设为忽略安全问题,设置--di ...

  10. Ajax 与文件上传

    一 Ajax篇 1 ajax简介(Asynchronous Javascript And XML) 异步,Js,XML,即使用Javascript语言与服务器进行异步交互,传输的数据为xml(可扩展标 ...