zoukankan      html  css  js  c++  java
  • 装饰器

      1 # 概念:本身就是一个闭包
      2 # 本质:就是一个返回函数的高阶函数。
      3 
      4 
      5 def func1():
      6     print(123)
      7 def func2():
      8     print(234)
      9     # 在函数内部可以调用另一个函数,必须保证这个函数在调用
     10     # 之前必须声明过
     11     func1()
     12 func2()
     13 
     14 
     15 print("-----------------------------")
     16 # 在函数内部声明及调用另一个函数
     17 def func3():
     18     print(1111)
     19     def func4():
     20         print(2222)
     21     func4()
     22 
     23 func3()
     24 
     25 # 什么是闭包:把一个函数作为参数,返回一个代替版的函数。
     26 # 闭包:一个返回函数的函数
     27 print('*******************************')
     28 # 最简单的闭包格式
     29 def closer():
     30     print("我是closerFunc")
     31     def inner():
     32         print("我是InnerFunc")
     33     # 调用函数
     34     # inner()
     35     # 把inner这个函数作为closer的返回值
     36     return inner
     37 res = closer()  # res === inner   res==inner函数
     38 res()   #    ==== inner()
     39 # 调用时简写
     40 closer()()  # closer() ==== inner
     41 
     42 
     43 # 细节注意
     44 def closer():
     45     print("我是closerFunc")
     46     def inner():
     47         print("我是InnerFunc")
     48     # 将inner的返回值作为closer的返回值返回
     49     return inner()
     50 res = closer()
     51 print(res)
     52 
     53 # 1、最简单的装饰器
     54 # 把一个函数作为参数,返回一个代替版的函数。
     55 def outer(func):
     56     print("---1---")
     57     def inner():
     58         print("---2---")
     59         func()
     60     return inner
     61 def testFunc():
     62     print("我是testFunc")
     63 print('---------------------------------------------')
     64 res = outer(testFunc)   # res ==== inner   # func = testFunc
     65 res() # ===inner()
     66 #  在执行inner这个函数时,执行了 func()
     67 # func这个形参对应实参为testFunc
     68 # 也就间接执行了testFunc()
     69 
     70 # 2、复杂一点的装饰器
     71 def outerFunc1(func):
     72     def inner(num):
     73         # 如果在内部函数执行的函数有参数,可以将通用的边界检测内容,
     74         # 放到装饰器中。
     75         if num > 200:
     76            num = 200
     77         elif num <= 0:
     78             num= 1
     79         func(num)   # func === getAge
     80     return inner
     81 def getAge(age):
     82     print("age==", age)
     83 res = outerFunc1(getAge) # res === inner
     84 res(12)
     85 res(300)
     86 res(-20)
     87 
     88 def getHeight(height):
     89     print("height==",height)
     90 res2 = outerFunc1(getHeight)
     91 res2(50)
     92 res2(300)
     93 res2(-12)
     94 '''
     95 结论:通过装饰器的方式,会使我们的代码变得更加简洁:
     96 将检测条件的逻辑放到一个相对独立的方法中,
     97 通过装饰器的包装应用到我们需要的地方。如果我们将检测条件放
     98 到原本的函数中,也可以达到相同的目的,但不可置否的是,
     99 使用装饰器的方式会使我们以最少的代码量达到我们的目的。
    100 '''
    101 # 3、使用@将装饰器应用到函数中
    102 # python2.4之后支持@符号
    103 def decoratorFunc(func):
    104     def inner(num):
    105         print("-----inner----")
    106         if num < 0:
    107             num = 0
    108         func(num)
    109     return inner
    110 print('*********************10:00***************************')
    111 @decoratorFunc
    112 def getAge(age):  # getAge  ==== decoratorFunc(getAge)   === inner
    113     print("age==",age)
    114 
    115 @decoratorFunc
    116 def getHeight(height):
    117     print("height==",height)
    118 # 执行函数
    119 # decoratorFunc(getAge)(100)
    120 getAge(200)
    121 getAge(-200)
    122 # decoratorFunc(getHeight)(-200)
    123 getHeight(100)
    124 getHeight(-10)
    125 
    126 
    127 # 4、通用的装饰器
    128 def deFunc(func):
    129     def inner(*args, **kwargs):
    130         print(args, kwargs)
    131         # if len(args) > 0:
    132         #     if isinstance(args[0], int):
    133         #         pass
    134         #     else:
    135         #         if len(args[0]) == 0:
    136         #             print("输入的内容不能为空")
    137         if kwargs.get("age") != None:
    138             if kwargs["age"] < 0:
    139                 kwargs["age"] = 0
    140         func(*args, **kwargs)
    141     return inner
    142 @deFunc
    143 def getName(name):
    144     print(name)
    145 @deFunc
    146 def getInfo(idNum, name, age):
    147     print(idNum, name, age)
    148 
    149 getName("11")
    150 getInfo(idNum="12", name="lucy", age=-13)
  • 相关阅读:
    python拆分pubchem SDF文件
    zlib压缩爬虫采集到的网页源码保存到mongodb减少存储空间
    openresty (lua-nginx_static_merger)合并css js文件 减少请求次数,提升页面速度
    scrapy采集—爬取中文乱码,gb2312转为utf-8
    不写代码的爬虫
    爬虫如何发现更多的url呢,怎么动态收集新的url连接
    python 将GIF拆分成图片方法
    Linux shell循环遍历
    iOS 11 导航栏放置UISearchBar 导航栏高度变高解决办法 (iPhone X出现的情况)
    隐藏UISearchBar中的删除按钮
  • 原文地址:https://www.cnblogs.com/BKY88888888/p/11265974.html
Copyright © 2011-2022 走看看