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

一、闭包

1、

如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包。

def outter():

name=‘python‘

def inner():

print name

return inner

res=outter() 把inner的地址赋值给res

res() 相当于执行inner()函数。通过闭包,可以把局部变量在外部也可以使用

2、判断是否为闭包 res.func_closure

inner()函数就是一个闭包

3、通过闭包,可以把局部变量在外部也可以使用

二、装饰器 @开始的

装饰器属于闭包,把一个函数当做参数后返回一个替代版函数。

1、定义

在代码运行期间在不改变原函数定义的基础上,动态给该函数增加功能的方式,称之为装饰器(Decorator)

装饰器的具体定义:

1、把要装饰的方法作为输入参数;

2、在函数体内可以进行任意的操作(可以想象其中会有很多应用场景);

3、只要确保最后返回一个可执行的函数即可(可以是原来的输入参数函数,也可以是一个新函数)。

作用:装饰器是一个很著名的设计模式,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

总体来说,装饰器其实也是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值给原来的标识符,并永久丧失对原始函数对象的访问。

(1)不带参数的装饰器

eg: ( @log装饰器)

#定义装饰器

def log(func):

def wrapper(*args,**kwargs):

print ‘call %s‘%func.__name__

return func(*args,**kwargs) return原函数,是为了返回保证原函数的返回值

return wrapper

解释:

因为有了(*args, **kw)这样的参数格式,这意味着装饰器能够接受拥有任何签名的函数作为自己的被装饰方法,同时能够用传递给它的参数对被装饰的方法进行调用。这样就能处理参数个数不同的函数了。

@log # 调用了log函数,并把now赋值给了log作为参数 @log = log(now)

def now():

now = time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime())

print ‘current time is %s‘%now

now() # now() == wraper()

如果now带有参数:now(2,3) @log =log(now) now(2,3)=log(now)(2,3) @log的返回值是wrapper 所以 now(2,3)=wrapper(2,3)

对于函数的又一次理解:

now() 相当于执行了now这个函数,ret=now() 相当于执行了now函数后,把返回值赋值给了ret

(2)带参数的装饰器

def deco(arg):

def _deco(func):

def __deco():

print "before %s called [%s]." % (func.__name__, arg)

func()

print " after %s called [%s]." % (func.__name__, arg)

return __deco

return _deco

@deco("mymodule")

def myfunc():

print " myfunc() called."

@deco("module2")

def myfunc2():

print " myfunc2() called."

myfunc()

myfunc2()

2、python自带的三个装饰器

@classmethod 定义实例方法为类方法

@staticmethod 定义实例方法为静态方法

@porperty 属性(对类属性的操作)

3、优点和用途

抽离出大量函数中与函数功能本身无关的的雷同代码并继续重用。

使用装饰器可以将函数“修饰”为完全不同的行为,可以有效的将业务逻辑正交分解,如用于将权限与身份验证从业务中独立出来。

如果一个函数需要一个功能,如果这个功能可以被使用在很多函数上,或是函数并不是自己实现,那可以写个装饰器来实现这些功能。

概况的将,装饰器的作用就是为已经存在的对象添加一些额外的功能。

时间: 2024-10-23 06:10:36

Python之面向对象:闭包和装饰器的相关文章

21.python中的闭包和装饰器

python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python2.7,其他版本可能存在差异. 也许直接看定义并不太能明白,下面我们先来看一下什么叫做内部函数: def wai_hanshu(canshu_1): def nei_hanshu(canshu_2): # 我在函数内部有定义了一个函数 return canshu_1*canshu_2 return

轻松理解python中的闭包和装饰器 (下)

在 上篇 我们讲了python将函数做为返回值和闭包的概念,下面我们继续讲解函数做参数和装饰器,这个功能相当方便实用,可以极大地简化代码,就让我们go on吧! 能接受函数做参数的函数我们称之为高阶函数,例如filter, map, reduce这些函数 可以定义一个函数作为高阶函数例如: def func(x, y, f): return f(x)+f(y) 可以这样调用func(2,-1,abs) 函数返回结果为3 有些时候,我们不需要显式地定义传入的函数,直接传入匿名函数更方便. 在Pyt

Python基础day-7[闭包,装饰器]

闭包: 首先说下闭包是什么? 闭包就是在函数内部定义的函数,包含对外部作用域的引用,但不包含全局作用域.因为函数的作用域在定义的时候就固定死了,所以闭包函数有自带作用域和延迟计算的特点. 闭包函数定义:如果一个内部函数,包含了对外部作用域的引用,但是不是包含全局作用域.那么这个函数就被认为是闭包函数.闭包函数可以使用".__closure__" 来查看闭包函数的属性.下面我们来看一个示例: def t(): money = 100 def s(): print(money) retur

python中的闭包和装饰器

闭包函数介绍 什么是闭包 维基百科中关于闭包的概念: 在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包.闭包可以用来在一个函数与一组 "私有" 变量之间创建关联关系.在给定函数被多次调用的过程中,这些私有变量能够保持其持久性. 对上面这段话总结一下,即python中的闭包需要满足3个条件:1) 内嵌函数,即函数里定义了函数 -- 这对应函数之间的嵌套2) 内嵌函数必须引用定义在外部函数里中的变量(不是全局作用域中的引用)-- 内部

聊聊Python中的闭包和装饰器

1. 闭包 首先我们明确一下函数的引用,如下所示: def test1(): print("--- in test1 func----") # 调用函数 test1() # 引用函数 ret = test1 print(id(ret)) print(id(test1)) #通过引用调用函数 ret() 运行结果: --- in test1 func---- 140212571149040 140212571149040 --- in test1 func---- 以y=kx+b为例,请

python函数2_闭包和装饰器

变量的范围(局部/全局) 局部变量 在函数内部声明的变量 在函数体外部无法获取 全局变量 在函数外部声明的变量 所有函数都可以访问 在函数内,局部变量和全局变量同名,优先使用局部变量 name = '月月' def fun2(): name = '小月月' name += '会弹吉他' print(name) fun2() 小月月会弹吉他 当在函数体内,尝试更改全局变量会报错 name = '月月' def fun2(): print(name) name += '会弹吉他' fun2() 当需

13、python中的函数(闭包与装饰器)

一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函数可以用来延迟函数的执行. 三.命名空间与变量作用域 变量作用域指的是变量的存活的范围.命名空间指的是属于一个对象的所有属性(对象)的集合. 示例: A的命名空间是A函数对象里面的所有对象的集合,包括变量a.函数B.变量b:B的命名空间就是属于函数B的所有对象的集合,包括变量b: a的变量作用域就是

Python核心编程的四大神兽:迭代器、生成器、闭包以及装饰器

生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值:在下一次调用该函数执行时,程序将从上一次暂停的位置继续往下执行. 通过一个例子来理解生成器的执行过程.求1-10的所有整数的立方并将结果打印输出,正常使用列表的实现如下: 输出结果如下: 当数据量很少时,可以很快得到结果.但是如果范围扩大到10000甚至是100000000,就会发现程序执行时间会变长,变卡,甚至有可能会因超出内存

Python进阶之[非局部变量,闭包,装饰器]

阅读Tacotron2源码 之 Python进阶 Non-Local Variable with Nested Function Closure in Python Decorator 1. Non-Local Variable with Nested Function ????在Python中,除了全局变量(Global Variable)和局部变量(Local Variable)之外,还有一种变量叫Non-Local Variable. ????Non-Local Variable的存在来源

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

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