Python之闭包and装饰器

闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛。

首先,我先为大家简单的接受一下闭包的概念。

闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回内层函数的引用的一种语法格式。

闭包的基本格式,代码实现:

def outer():
    num = 0
    def inner():
        # 使用外部函数的变量
        print(num)
    return inner # 返回inner函数在内存空间中的地址

# 将outer函数的返回值赋值给变量f,也就是说将f指向outer函数中的inner函数的内存地址
f = outer()
# 调用inner函数
f()

我们学习闭包的作用,其实就是为了学习装饰器。

那么,我们先来了解一下什么是装饰器。

装饰器就是通过闭包来对指定的函数进行功能的扩充。

装饰器的特点:

1.不修改指定修饰函数的代码,

2.不修改指定修饰函数的调用方式,

3.给指定修饰函数增加相应的功能。

装饰器的种类:

1.普通装饰器

  普通装饰器就是闭包语法格式的基础上,满足装饰器的特点的一种语法格式。

普通装饰器的代码实现:

def decorator(func):
    # 此时func指向的是show函数
    def inner(*args,**kwargs):
        # 装饰的代码
        ret = func()
        return ret
    return inner 

@decorator  # 原理为 show = decorator(show)
#   此时show指向的是decorator函数中的inner函数
def show():
    print(‘show run....‘)

# 此时相当于调用decorator函数中的inner函数,并函数的返回值赋值给ret
ret = show()

2.类装饰器

  类装饰器就是通过一个类来装饰函数,相较于普通装饰器,类装饰器可以使用父类中的方法。

类装饰器的代码实现:

class Decorator(object):
    # 使用init方法来接收需要装饰的函数
    def __init__(self, func):
        # func指向show函数所在的内存空间地址
        # 使用__func指向需要装饰的函数的内存空间地址
        self.__func = func

    # 可以让类的对象通过对象名()的方式被调用
    def __call__(self, *args, **kwargs):
        # 此时相当于调用了show函数
        ret = self.__func(*args, **kwargs)
        return ret

@Decorator  # 原理是 show = Decorator(show)
# 此时show指向的是Decorator类的对象的内存地址
def show():
    print(‘show run .....‘)

# 此时表示Decorator对象被调用,并接受show函数的返回值
ret = show()

未完待续....

原文地址:https://www.cnblogs.com/chao666/p/12053823.html

时间: 2024-08-14 00:02:15

Python之闭包and装饰器的相关文章

Python函数编程——闭包和装饰器

Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包.也就是说,内部函数会在外部函数返回后被执行.而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量.参数以及其他内部函数.这些局部变量.参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响. def outer(

python的闭包及装饰器

闭包: 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体 1.函数是一个对象 2.函数执行完成后内部变量回收 3.函数属性 4.函数的返回值 实例一. 分别检测分数科目总分为100.150两种情况的成绩 初级代码如下: # -*- coding:utf-8 -*- ###检测分数总数为100分的及格情况

python的闭包、装饰器和lambda等(笔记)

参考: http://blog.csdn.net/marty_fu/article/details/7679297(闭包,推荐看这个) https://foofish.net/python-decorator.html(装饰器,推荐) http://www.cnblogs.com/tqsummer/archive/2010/12/27/1917927.html(yield) http://www.cnblogs.com/longdouhzt/archive/2012/05/19/2508844.

Python高级--闭包与装饰器

前言:在Python中,闭包是一种非常有用的功能!它通常与装饰器一起搭配使用,可以在不改变被装饰函数的功能的基础上,完成更多的功能.如权限认证. 一.如何定义闭包 1.闭包就是两个嵌套的函数,外层函数返回内层函数的引用,而且外层函数必须携带参数!为什么外层函数必须要有参数呢?可以思考一下! 基本格式如下: 1 def outer_fun(func): 2 def inner_fun(): 3 pass 4 return inner_fun 2.与普通函数的区别: 闭包的外层函数的变量可以在内存中

python中闭包和装饰器

---恢复内容开始--- 使用像javascript和python这样支持面向对象范式的语言进行编程时,都会涉及到闭包的概念以及闭包的使用.我们今天就从这两个方面来讨论一下闭包: 首先是维基百科中关于闭包的概念:在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包.闭包可以用来在一个函数与一组"私有"变量之间创建关联关系.在给定函数被多次调用的过程中,这些私有变量能够保持其持久性. 根据这句话,其实我们自己就可以总结出在python语

Python作用域-->闭包函数-->装饰器

1.作用域: 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我要理解两点:a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改) 下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1 如果局部没有定义变量x,那么函数内部会从内往外

python之闭包,装饰器

目录 函数对象 :相当于变量名 函数对象的作用: 1. 可以引用 2. 可以作为函数的返回值 3. 可以作为容器的元素 4. 可以作为函数的参数 闭包 定义: python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure) 闭包的意义: 返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,优先使用自己外层包裹的作用域 装饰器 本质:装饰器 = 函数.

Python之闭包与装饰器

闭包 由于闭包这个概念比较难以理解,尤其是初学者来说,相对难以掌握,所以我们通过示例去理解学习闭包. 给大家提个需求,然后用函数去实现:完成一个计算不断增加的系列值的平均值的需求. 例如:整个历史中的某个商品的平均收盘价.什么叫平局收盘价呢?就是从这个商品一出现开始,每天记录当天价格,然后计算他的平均值:平均值要考虑直至目前为止所有的价格. 比如大众推出了一款新车:小白轿车. 第一天价格为:100000元,平均收盘价:100000元 第二天价格为:110000元,平均收盘价:(100000 +

python的闭包和装饰器

闭包 闭包的定义 1.闭:定义在函数内部的函数 2.包:内部函数引用了外部函数作用域的名字 函数的参数传达 1.直接传参 def index1(username): print(username) 2.闭包来实现函数内参数传达 def outter(x,y): # x = 1 # y = 40 def my_max(): if x > y: return x+y return y return my_max res1 = outter(1, 40) print(res1) res2 = outt