# 装饰器,对一个函数打扮

# def foo():
# print("foo")
# foo
# foo()
# def test1():
# print('-----1-----')
# def test1():
# print('-----2-----')
# test1()

# 需求来了

# 开放封闭规则
# 封闭:以实现的功能代码块
# 开放:对扩展开放

# 语法糖
# def w1(func):
  # def inner():
    # # 验证1
    # # 验证2
    # # 验证3
    # func()
  # return inner

# @w1
# def f1():
  # print('1111111')

# @w1
# def f2():
  # print('2222222')

# @w1
# def f3():
  # print('3333333')

def w1(func):
  def inner():
    print("----正在验证权限-----")
    func()
  return inner

def f1():
  print('------f1--------')

def f2():
  print('------f2--------')

# innerFunc = w1(f1)
# innerFunc()

# innerFunc = w1(f2)
# innerFunc()

f1 = w1(f1)
f1()

# 2----------
# def w1(func):
  # def inner():
    # print("----正在验证权限-----")
    # if False:
      # func()
    # else:
      # print("没有权限")
  # return inner

# @w1 # f1 = w1(f1)
# def f1():
  # print('------f1--------')

# @w1
# def f2():
  # print('------f2--------')

# f1()
# print('---------------------')
# f2()

# 再议装饰器
# def makeBold(fn):
# def wrapped():
# print('---------1-------------')
# return "<b>"+ fn() +"</b>"
# return wrapped

# def makeTtalic(fn):
# def wrapped():
# print('---------2-------------')
# return "<i>"+ fn() +"</i>"
# return wrapped

# # 装饰器从下往上装,调用从上往下调用
# @makeBold
# @makeTtalic
# def test3():
# print('---------3-------------')
# return 'hello world-3'

# ret = test3()
# # ---------1-------------
# # ---------2-------------
# # ---------3-------------

# print(ret)
# # ---------1-------------
# # ---------2-------------
# # ---------3-------------
# # <b><i>hello world-3</i></b>

# 装饰器什么时候进行装饰
def w1(func):
  print("--正在装饰1-----")
  def inner():
    print("----正在验证权限1-----")
    func()
  return inner

def w2(func):
  print("--正在装饰2-----")
  def inner():
    print("----正在验证权限2-----")
    func()
  return inner

# 只要python解释器执行到了这个代码,那么就会自动的进行装饰,而不是等调用的时才装时的
@w1
@w2
def f1():
  print('------f1--------')

# --正在装饰-----

# 再调用之前已经装饰好了
f1()

# --正在装饰2-----
# --正在装饰1-----
# ----正在验证权限1-----
# ----正在验证权限2-----
# ------f1--------

python 装饰器(1)的更多相关文章

  1. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  2. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  3. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  4. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  5. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  6. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  7. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

  8. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  9. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

  10. python装饰器方法

    前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...

随机推荐

  1. C# 锁

    1.简介 锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性 ...

  2. struts文件下载机制

    Struts2 中使用 type="stream" 的 result 进行下载即可.只用提供一个输入流inputStream,剩下的输出工作struts帮我们做. 例子一: 1.可 ...

  3. Akka Quickstart with Java-笔记

    官方文档: http://developer.lightbend.com/guides/akka-quickstart-java/?_ga=2.177525157.1012573474.1504767 ...

  4. 2.获取公开的漏洞信息-查询还有哪些系统补丁未堵住-查询exp

    本章内容为第一课的实战部分,请结合原创一起浏览. 微软官网 https://www.microsoft.com/zh-cn 在页脚找到TechNet 查看安全公告 MS系列微软编号在微软安全报告中存在 ...

  5. json文件解析

    场景 读取json文件,读取子域名扫描结果 实现 >>> import json >>> with open("C:\\Users\\Windows32\ ...

  6. Linker Scripts3--MEMORY Command

    1.前言 链接器的默认配置允许所有有效内存的分配,你可以使用MEMORY命令来重新定义它 2.MEMORY命令 MEMORY命令描述了一个内存块的位置和大小.你可以用它来描述哪块内存区域可以被链接器使 ...

  7. LNMP下Nginx 中文文件名或目录404无法访问的解决方法

    貌似很多人还是会遇到中文乱码的问题,Apache可以使用mod_encoding支持中文目录和文件,LNMP下Nginx其实不需要安装额外的组件即可支持中文文件名或中文目录,下面说一下常见的CentO ...

  8. 如何确定windows启动类型是bios还是uefi

    原文地址:http://www.kqidong.com/bios/3728.html 如何确定windows启动类型是bios还是uefi?随着装机越来越简单,大家对安装系统充满信心,但是了解到启动类 ...

  9. linux c 时间函数

    1. time() 函数提供了 秒 级的精确度 time_t time(time_t * timer) 函数返回从UTC1970-1-1 0:0:0开始到现在的秒数 2. struct timespe ...

  10. $Django patch与put,视图组件,路由控制,响应器

    1 patch与put(幂等?回顾) PATCH 与 PUT 属性上的一个重要区别还在于:PUT 是幂等的,而 PATCH 不是幂等的.幂等是一个数学和计算机学概念,在计算机范畴内表示一个操作执行任意 ...