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

    # 开放屏蔽原则
    # 对某些东西是开放的,对某些东西是屏蔽的
    # 一般情况下是不允许在代码里边进行修改的。
    # 一般是在外部进行开放的,只能在外部进行修改。




    def outer(func): # func = f1
    def inner():
    print("hello")
    print("hello")
    print("hello")
    r = func() # r = None
    print("end")
    print("end")
    print("end")
    return r
    return inner # 返回inner的值 f1 就等于 inner 的内存地址


    @outer # f1 = outer(f1)
    def f1():
    print("F1")


    f1()

    # 装饰器的原理
    # 使用装饰器,将原函数封装到新函数里面,执行原来的函数,并执行新的函数
    # @ 符号有特殊性
    # @outer
    # 1、执行@后面的 outer 函数,并且将其下面的 f1 函数名(不加括号),当做参数传递进去
    # 2、将outer的返回值重新赋值给 f1,f1 = outer 的返回值
    # f1()就是新的f1函数,= inner


    ######################## 林hf
    # 装饰器,用来装饰函数,可以让函数执行之前或执行之后做一些操作
    # 装饰器本质:是函数,功能:装饰其他函数(就是为其他函数添加附加功能)

    # 原则:
    # 1、不能修改被装饰的函数的源代码
    # 2、不能修改被装饰的函数的调用方式
    # 1、新增一个功能,不能够修改一个函数的源代码,函数一旦写好了,原则上就不能修改源代码

    """
    装饰器知识储备:
    1、函数即"变量"
    2、高阶函数
    满足以下条件之一就可以
    a、把一个函数名当做实参传给另个一个参数(在不修改被装饰函数源代码的情况下为其添加功能)
    b、返回值中包含函数名(不修改函数的调用方式)
    3、嵌套函数
    a、在一个函数体内,用def去定义一个函数,叫嵌套
    高阶函数 + 嵌套函数 = 》 装饰器

    """

    # 开放屏蔽原则
    # 对某些东西是开放的,对某些东西是屏蔽的
    # 一般情况下是不允许在代码里边进行修改的。
    # 一般是在外部进行开放的,只能在外部进行修改。

    """

    def outer(func): # func = f1
    def inner():
    print("hello")
    print("hello")
    print("hello")
    r = func() # r = None
    print("end")
    print("end")
    print("end")
    return r
    return inner # 返回inner的值 f1 就等于 inner 的内存地址


    @outer
    def f1():
    print("F1")

    f1()
    """
    # @ 符号具有特殊性
    # @outer
    # 1、执行@后的outer函数,并且将其下面的函数名f1当作参数,传递进去 f1 == func
    # 2、将outer的返回值,重新赋值给了f1, f1 == outer的返回值
    # 3、执行f1() 时,就不会执行原来的f1函数了,而是执行新的返回值f1。
    #
    #
    #

    # def outer(func): # func 就等于原来的f1函数
    # def inner():
    # print("hello")
    # print("hello")
    # print("hello")
    # r = func() # r = None
    # print("end")
    # print("end")
    # print("end")
    # return r
    # return inner # outer的返回值 inner 就是一个内存地址,因为没有加(),将inner重新赋值给f1,现在的f1()就是:三括号里
    """
    # def inner():
    # print("hello")
    # print("hello")
    # print("hello")
    # r = func() # 此时的func()就是原来的f1
    # print("end")
    # print("end")
    # print("end")
    # return r

    """
    # def outer(func): # func = f1
    # def inner():
    # print("hello")
    # print("hello")
    # print("hello")
    # r = func() # r = None
    # print("end")
    # print("end")
    # print("end")
    # return r
    # return inner # 返回inner的值 f1 就等于 inner 的内存地址
    #
    #
    # @outer
    # def f1():
    # print("F1")
    #
    #
    # f1()
    #
    #
    # @outer
    # def f1():
    # print("F1")
    #
    #
    # f1()



    #### 举例1: ####
    def outer(func):
    return "SB"

    @outer
    def index():
    return True

    print(index)
    # SB

    #### 举例3: ####
    def outer(func):
    def inner():
    print('123')
    return inner

    @outer
    def index():
    return True

    index()
    # 123
    #### 举例2: ####
    def outer(func):
    def inner():
    print('123')
    func()
    print('456')
    return inner

    @outer
    def index():
    print('acb')
    return True

    index()
    # 123
    # abc
    # 456
    
    

     #### 加上参数的 装饰器。


    #### 加参数 装饰器 举例1:####
    def outer(func):
    def inner(b1, b2):
    ret = func(b1, b2) # 1、执行index(b1,b2)函数 2、并将返回值复制为ret
    c1 = b1 - b2
    print('我是inner 减', c1)
    c2 = b1 * b2
    print('我是inner 乘', c2)
    c3 = b1 / b2
    print('我是inner 除', c3)
    return ret

    return inner

    @outer
    def index(a1, a2):
    print(a1,a2,'用第一个参数在前,第二个参数在后')
    cc = a1 + a2
    print('我是index 和', cc)
    return True

    index(10, 2)
    # 只要函数应用装饰器,那么函数就被重新定义,重新定义为:装饰器的内层函数

     ####  对应不确定参数的个数时候,怎么解决?

    希望写一个装饰器,可以满足多个函数都可以应用上。不管是一个参数还是多个函数,还是任意个参数。

    # ### 可以接受任意的参数  举例1; ####

    def f1(*arg, **kwargs):
    print(arg)
    print(kwargs)

    f1(1, 2, 3, 34, 4, k1=123)
    # (1, 2, 3, 34, 4)
    # {'k1': 123}

     

    增加多个装饰器:
    # 定义一个将小写转换为大写的程序
    # 1、要将转换后的两边加上<p> xxx <p>
    # 2、新增需求,将<p>两边再加上<div>
    def add_div(func):
    def inner(aa):
    return "<div>" + func(aa) + "</div>"

    return inner


    def add_p(func):
    def inner(aa):
    return "<p>" + func(aa) + "</p>"

    return inner


    @add_div
    @add_p
    def my_upper(text):
    v = text.upper()
    return v


    print(my_upper('wo ai ni zhongguo'))

    装饰器中增加参数


    我的目标是每天厉害一点点
  • 相关阅读:
    [Jenkins] TestComplete 使用Jenkins进行持续集成测试
    selenium 使用close和quit关闭driver的不同点
    sleep和wait的区别
    Appium-测试失败后获取屏幕截图的方法
    sql优化的几种方式
    【Fine学习笔记】python 文件l操作方法整理
    【Fine学习笔记】Xcode的快捷方式
    【Fine学习笔记】Jmeter笔记
    【Fine原创】常见的HTTP错误码的具体含义整理
    【Fine原创】JMeter分布式测试中踩过的那些坑
  • 原文地址:https://www.cnblogs.com/sidaofeng/p/10179067.html
Copyright © 2011-2022 走看看