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

# 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. Invalid character found in the request target.

    背景:springboot项目内置tomcat9.0 调用的接口中有{}就会报错 解决办法: 新的tomcat新版本增加了一个新特性,就是严格按照 RFC 3986规范进行访问解析,而 RFC 398 ...

  2. 【转】python之配置日志的几种方式

    [转]python之配置日志的几种方式 作为开发者,我们可以通过以下3种方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用 ...

  3. (转载)深度学习的weight initialization

    本文转自:谷歌工程师:聊一聊深度学习的weight initialization TLDR (or the take-away) Weight Initialization matters!!! 深度 ...

  4. GCC 编译优化指南【转】

    转自:http://www.jinbuguo.com/linux/optimize_guide.html 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布. ...

  5. linux系统的三种网络连接模式

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1 ...

  6. day2 --> pyc 文件

    执行python 代码时,如果导入了其他的.py文件,那么,执行过程中会自动生成一个与其同名的.pyc文件,该文件就是python解释器便宜之后产生的字节码. PS:代码经过便宜可以产生字节码;字节码 ...

  7. expect学习笔记及实例详解

    因为最近正在学习expect脚本,但是发现网上好多文章都是转载的,觉得这篇文章还不错,所以简单修改之后拿过来和大家分享一下~ 1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的 ...

  8. [1]字符串按中文符占3位进行指定长度剪切[2]Double类型截取指定长度(指定长度=整数位+小数位)

    /** 将中文字符串剪切为在当前db2(编码GBK)中所占用的长度*/ public String cutStringForDb2(String src,Integer size) { int len ...

  9. java的小数比较反例

    double num = 0.3; System.out.println(num); System.out.println(num - 0.2); System.out.println(num - 0 ...

  10. [转]GitHub上优秀的Go开源项目

    转载于GitHub上优秀的Go开源项目 正文 近一年来,学习和研究Go语言,断断续续的收集了一些比较优秀的开源项目,这些项目都非常不错,可以供我们学习和研究Go用,从中可以学到很多关于Go的使用.技巧 ...