Python基础篇【第九篇】:剖析装饰器

装饰器:装饰器:装饰器的语法以@开头,然后是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数.剖析装饰器:
#!/usr/bin/env python3

‘‘‘
装饰器:装饰器的语法以@开头,然后是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数.
表现形式:
    def outer():
        def inner():
            print("xxx")
            return test
        return inner

    @outer
    def f1():
        pass
    f1()
‘‘‘

# def outer(func):
#     def inner(*args, **kwargs):
#         print("123")
#         ret = func(*args, **kwargs)
#         #print(ret)
#         print("456")
#         return ret
#     return inner

def outer_0(func):
    def inner(*args, **kwargs):
        print("3.5")
        ret = func(*args, **kwargs)
        print(ret)
        return ret
    return inner

@outer_0
# @outer
def index(a1,a2):
    print("这是index函数的内容!")
    return a1 + a2

# ret = index(1,2)
# print(ret)

index(1,2)

# @outer_0
# def f1():
#     print("F1")
#     return "aaaaa"
# f1()

‘‘‘
以上装饰器执行经过剖析:
    1.程序开始执行,看到函数"def outer(func)",不会执行,并把此函数放入到内存中去,然后继续往下执行.
    2.看到函数"def outer_0(func):"放入到内存中,不会执行.
    3.往下执行的时候看到@outer_0并会执行此函数,然后解释器会把@outer_0下面的函数"index"当做实参传入到"outer_0"函数中的形参"func"里,所以现在"index" = "func"
        def outer_0(index):                         #拿到index函数,把它当做实参传入到函数中
            def inner(1, 2):                        #第二级函数(它会从一级函数中找到相应的值传进来,而这个inner就会把index的参数给传进来),形体参数对应着实体参数所以*args = 1, ##kwargs = 2
                print("3.5")                        #自己函数体的值
                print("这是index函数的内容!")       #从index函数中拿到的值
                ret = func(1, 2)                    #在这赋值一个变量ret,然而这个变量的值是func(1, 2),why? because func就是index的返回值1, 2就是从index的实体参数
                print(ret)                          #然后把这个返回值给输出出来
                return ret                          #最后把返回值给上一层的函数
            return inner
    4.然后将outer_0的返回值重新定义给"index"函数,就是"index"等于"outer_0"的返回值!这一步就相当于重新创建了一个新的"index"函数!而这个新的"index"函数的内容,就是"outer_0"的返回值!("index" = "outer_0"的返回值)

‘‘‘

  代码执行结果:

C:\Users\Administrator\AppData\Local\Programs\Python\Python35\python.exe D:/pycharm/obj/old_boy/day07/装饰器.py
3.5
这是index函数的内容!
3

Process finished with exit code 0

  *注:多个执行多个装饰器的时候处理方式。

@outer
@outer_0
def index():
    print("test")
index()
#等于一下方式执行:
    (outer*index)*outer_0
    (outer*outer_0)*index
以乘法的方式进行运算!

  

  

时间: 2024-10-22 21:57:58

Python基础篇【第九篇】:剖析装饰器的相关文章

Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了.所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器:generator. 要创建一个generator,有很多种

Python基础(7)闭包函数、装饰器

一.闭包函数 闭包函数:1.函数内部定义函数,成为内部函数, 2.改内部函数包含对外部作用域,而不是对全局作用域名字的引用 那么该内部函数成为闭包函数 #最简单的无参闭包函数 def func1() name='ares' def func2() print(name) #有参和返回值的闭包函数 def timmer(func): def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) stop

python基础知识第九篇(函数)

函数 >>>>>>>>>>> : 使用函数的好处 1.代码重用 2.保持一致性,方便维护 3.可扩展性 定义方法 def test01(): age="sasa,sdda" print(age) return(age) #形参,不调用时不占内存,必须一一对应,缺一不行,多一也不行#实参,定义实际的值,这叫位置参数,一个参数不能传两个值,也可以s=test(x=1,z=2,y=3), def test(x, y, z):

Python之命名空间、闭包、装饰器

一.命名空间 1. 命名空间 命名空间是一个字典,key是变量名(包括函数.模块.变量等),value是变量的值. 2. 命名空间的种类和查找顺序 - 局部命名空间:当前函数 - 全局命名空间:当前模块 - 内建命名空间:所有Python环境,所有模块 查找顺序 1.先在当前 (嵌套的或 lambda) 函数的命名空间中搜索 2.然后是在父函数的命名空间中搜索 3.接着是模块命名空间中搜索 4.最后在内置命名空间中搜索 要到内置命名空间都没找到的话,就会弹出NameError 这里看一个例子 i

python深入学习--decorator强大的装饰器

一.decorator基础. 最初接触python是在大学毕业进入某一游戏公司后,最开始觉得python不严谨,很不喜欢python这种"简单"的脚本,但是后来,越来越离不开python了,觉得这么灵活方便的语言,简直是程序员的福音,尤其是它的数据结构,他带来了一个"{}" 大括号就能搞定一切的时代.当然python还有很多优秀的特性.现在我们来讲python的特性之一--decorator(装饰器). 装饰器,顾名思义就是修饰函数或者类的,它把要装饰的函数作为参数

Python之面向对象:闭包和装饰器

一.闭包 1. 如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包. def outter(): name='python' def inner(): print name return inner res=outter() 把inner的地址赋值给res res() 相当于执行inner()函数.通过闭包,可以把局部变量在外部也可以使用 2.判断是否为闭包 res.func_closure inner()函数就是一个闭包 3.通过闭包,可以把局部变量在外部也可以

python中的函数式编程与装饰器

2.1 python中的函数式编程 函数式编码的特点 把计算视为函数而非指令 纯函数式编程,不需要变量,没有副作用,测试简单 支持高阶函数,代码简洁 python支持的函数式编程 不是纯函数式编码:允许有变量 支持高阶函数:函数也可以作为变量传入 支持闭包:有了闭包就能返回函数 有限度地支持匿名函数 2.2 python中高阶函数 函数名可以作为变量,如 高阶函数:只能接收函数作为参数的函数 变量可以是指向函数 函数的参数可以接收变量 一个函数可以接收另一个函数作为参数 能接收函数作为参数的函数

Python小程序练习二之装饰器小例子

Python小程序练习二之装饰器小例子 装饰器: 装饰器实际上就是为了给某程序增添功能,但该程序已经上线或已经被使用,那么就不能大批量的修改源代码,这样是不科学的也是不现实的,因为就产生了装饰器,使得其满足: 1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 那么根据需求,同时满足了这两点原则,这才是我们的目的. 装饰器的原则组成: < 函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器 > 错误例子: 1.1Decorators.py 1 # The aut

python 基础篇 11 函数进阶----装饰器

11. 前??能-装饰器初识本节主要内容:1. 函数名的运?, 第?类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ?. 闭包什么是闭包? 闭包就是内层函数, 对外层函数(非全局)的变量的引?. 叫闭包 可以使用_clesure_检测函数是否是闭包  返回cell则是闭包,返回None则不是 闭包的好处: 由它我们可以引出闭包的好处. 由于我们在外界可以访问内部函数. 那这个时候内部函数访问的时间和时机就不?定了, 因为在外部,