python 装饰器、内部函数、闭包简单理解

转载自:https://www.cnblogs.com/starsea/p/5427021.html

python 装饰器、内部函数、闭包简单理解

python内部函数、闭包共同之处在于都是以函数作为参数传递到函数,不同之处在于返回与调用有所区别。

1、python内部函数

python内部函数示例:

def test(*args):
    def add(*args):         #  显示的调用外部函数的参数
        return args
    return add(*args)       #  返回内部函数的直接调用
 
运行结果如下:
test(1,2,3)
(1,2,3)

 
内部函数直接引用外部函数参数,外部函数test显示的返回内部函数add的调用。
当需要在函数内部多次执行复杂任务时,内部函数非常有用,从而避免了循环和代码的堆叠重复。

 

2、python闭包

内部函数可以看作是一个闭包。闭包是一个可以由另一个函数动态生成的函数,并且可以改变和存储函数外创建的变量的值。


python闭包示例:

def test(a):
    def add():                                #  没用引用外部函数的参数
        return "it's a callable %s" % a       #  直接在内部函数使用外部函数的参数
    return add                                #  返回内部函数本身,不返回内部函数调用
 
运行结果如下:
a1 = test(1)           # 动态生成的一个可以记录外部变量的函数
<function __main__.add>
 
a1()                   # 调用此函数
it's a callable 1
 
test(1)()              # 本身调用过程,先动态生成一个函数再进行调用
it's a callable 1

 

3、python装饰器

装饰器实质上是一个函数,它把一个函数作为输入并且返回另外一个函数,在装饰器中,通常使用下面这些python技巧:

  • *args 和 **kwargs

  • 闭包

  • 作为参数的函数

python装饰器示例:

def test(func):                           # 将函数作为参数进行传递
    def add(*args,**kwargs):
        print “it's a d”
        return func(*args,**kwargs)       # 内部函数进行相关操作以后,返回传递函数的调用
    return add
 
 
def func(a,b):
    return a+b
 
运行结果如下:
test(func)                # 将func作为函数传递进test函数进行装饰
<function __main__.add>   # 装饰后的函数,类似闭包
 
test(func)(1,2)           # 显示的对装饰后的函数进行调用
it's a d                  # 中间被装饰的过程被print出来
3
 
更简单的方法调用装饰器
@test                     # 同一个函数可以调用多个装饰器,执行过程中不分先后顺序
def func(a,b):
    return a+b
 
无论传入test()的函数func是什么,装饰器都会返回一个新的函数,其中包含test增加的额外语句。<br>实际上,装饰器并不需要执行函数func中的代码,只是在结束前函数add调用函数func以得到的func返回的结果和附加代码的结果

 装饰器本身需要传递参数的时候:

def test(cmd):                            # 将参数传递
    def exc(func):                        # 第二步进行函数作为参数传递
         def add(*args,**kwargs):
             print "it's a %s" % cmd
             print "begin"
             return func(*args,**kwargs)
         return add
    return exc
  
 运行结果如下:
 test('haha')
 <function __main__.exc>
  
 test('haha')(func)(1,2)            # 调用装饰器返回结果
 it's a haha
 begin
 3
  
 更简单的方法调用
 @test('haha')                     # test函数进行了参数传递
 def func(a,b):
    return a+b

 python装饰器注意事项:
对func进行装饰以后,func的函数命名空间发生了变化

执行 func.__name__
add

 如何指向原来的命名空间呢?python自带了functools库直接调用则行

import functools
def test(func):
    @functools.wraps(func)
    def add(*args,**kwargs):
        print "it's a decorator"
        return func(*args,**kwargs)
    return add
     
@test
def func(a,b):
    return a+b
     
再次运行,查看命名空间
func.__name__
func                  # 返回了本身
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
辽B代驾管理系统对代驾订单管理、用户咨询管理、代驾订单评价管理、代驾订单投诉管理、字典管理、论坛管理、公告管理、新闻信息管理、司机管理、用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行辽B代驾管理系统程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。辽B代驾管理系统的开发让用户查看代驾订单信息变得容易,让管理员高效管理代驾订单信息。 辽B代驾管理系统具有管理员角色,用户角色,这几个操作权限。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 辽B代驾管理系统针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理代驾订单信息,管理公告信息等内容。 辽B代驾管理系统针对用户设置的功能有:查看并修改个人信息,查看代驾订单信息,查看公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看代驾订单,删除代驾订单操作,新增代驾订单操作,修改代驾订单操作。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。新闻管理页面,此页面提供给管理员的功能有:新增新闻,修改新闻,删除新闻。新闻类型管理页面,此页面提供给管理员的功能有:新增新闻类型,修改新闻类型,删除新闻类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值