博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洗礼灵魂,修炼python(30)--装饰器(2)—>装饰器总结+进阶使用
阅读量:5967 次
发布时间:2019-06-19

本文共 3087 字,大约阅读时间需要 10 分钟。

在上一篇博文的经典案例中,我想你应该对装饰器有很好的了解了,不过光有那些还不够真的,还需要总结和进阶一下,所以本篇博文解析装饰器进阶。

 

装饰器

1.什么是装饰器?

个人理解:装饰器又叫语法糖,指的是对原程序内部整个代码不作任何更改,在外部写好一个带某种功能的程序来作用于原程序,对其进行修饰或者叫装饰,这就是装饰器。

还有两种理解是:

1).在代码运行期间动态增加功能的方式,称之为“装饰器”

2).装饰器,允许向一个现有的对象添加新的功能,同时又不改变其结构。作为现有对象的一个包装

2.格式:

def func():  suite@funcdef func1():  suite

@func即表示装饰器,这个写法等价于func=func(func1)

例子:

一般用法:

 

 使用装饰器:

 

是的,你发现了,其实两个写法得到的结果是一样的。所以印证前面那句话,是等价的

即:等价于:

 

4.装饰器的作用:

1).装饰器可以极大的简化代码,避免每个函数编写重复性代码

2).装饰器在实际的开发中很实用,不需要修改原代码,直接对其进行重新扩展功能即可

3).装饰器遵循封闭开放原则。

  • 封闭:已实现的功能代码块
  • 开放:对扩展开发

5.装饰器内装饰的函数一样可以传入参数:

外层函数传入的是函数对象作为参数,内层函数传入的是外层函数的传入的函数的参数作为参数,听起来有点拗口,集合看上面的例子看你就懂了

6.一个函数可以被多个装饰器装饰

 

def outer1(func):    def inner(*args,**kwargs):        print("认证成功!")        return func(*args,**kwargs)    return innerdef outer2(func):    def inner(*args,**kwargs):        print("开始解决第一个项目问题")        return func(*args,**kwargs)     return innerdef outer3(func):    def inner(*args,**kwargs):        print('开始解决第二个项目问题')        return func(*args,**kwargs)    return inner@outer1@outer2@outer3def bumen1(name,age):    print("%s 正在连接部门1数据接口......"%name) bumen1("yang",21)

结果:

 

 

 7.装饰器自身也可以带参数

1).装饰器带参数,函数不带:

def out(arg):      def inner1(func):          def inner2():              print("before %s called [%s]." % (func.__name__, arg))                        func()              print("after %s called [%s]." % (func.__name__, arg))                    return inner2      return inner1 @out("module2")  def myfunc():      print("myfunc() called.")myfunc()

 

 结果:

2).装饰器和函数都带参数:

 

def out(arg):      def inner1(func):          def inner2(num):              print("before %s called [%s]." % (func.__name__, arg))                        print(func(num))            print("after %s called [%s]." % (func.__name__, arg))                    return inner2      return inner1 @out("mymodule") def myfunc1(num):      print("myfunc1(%d) called."%num)    return 'the args is :%d'%nummyfunc1(2)

 

结果:

 

绕晕了?没看明白吧?来个简单点的:

 

 

3).装饰器还可以带多个参数或者默认参数,用*args,**kwargs表示即可,这个什么类型的参数在前面讲过的,这里直接略过。传入多个参数方法和传入一个参数是一样的,不再解析

 

其实你应该发现了,装饰器带参数其实就是在两层的基础上又加了一层来为装饰器传参的。

8.装饰器传入函数作为参数

这个想想就觉得厉害了对不?

def auth(request,*kargs):    print('认证成功')    def error_debug(request,*kargs):    print('日志记录成功')def out(auth_func,debug_func):    def inner1(func):        def inner2(request,*kargs):            auth_func=auth(request,*kargs)                        #主体只是print的函数没有返回值,为空。不信的话你可以定义一个并打印看看就明白            #当有异常抛出时不为空,所以这里设置不为空提前结束程序并返回异常            if auth_func!=None:                return auth_func                        main_func=func(request,*kargs)            if main_func!=None:                return main_func             error_func=error_debug(request,*kargs)            if error_func!=None:                return error_func        return inner2    return inner1@out(auth,error_debug)def func(name,*age):    print('%s正在开发项目'%name)func('yang')

 

 结果:

 

 

好的装饰器就到这,具体的开发运用的话,装饰器可以用到很多,比如可以传入一个类对象,传入另一个装饰器,还有在做项目时,写好一个框架,把框架作为装饰器等等的。具体的自己研究吧,反正装饰器挺强大的。

 

 

简单练习:(据说这是一道面试题)

请利用装饰器的方法将下面函数返回的结果小写:

def upper_func(string):

  return string.uppper()

upper_func(I Play Basketball')

转载于:https://www.cnblogs.com/yangva/p/7662197.html

你可能感兴趣的文章
python3第八天(面向对象)
查看>>
pomelo的session
查看>>
我的友情链接
查看>>
ubuntu atp&dpkg
查看>>
主要 次要通道
查看>>
利用贝叶斯分类器进行文本挖掘---笔记
查看>>
我的友情链接
查看>>
将ping命令结果输出到文本
查看>>
小蚂蚁学习mysql性能优化(8)--数据库结构优化--范式化和反范式化,水平分表,垂直分表...
查看>>
find
查看>>
L2TP/IPSec一键安装脚本
查看>>
听你自己的节奏
查看>>
MySQL触发器的使用
查看>>
Step1:Install EBS and Configure
查看>>
C#获取文件大小
查看>>
HTML和CSS 基本要点必看
查看>>
关于Cocoa框架的争论
查看>>
万用表判断场效应管的好坏
查看>>
py requests.post2
查看>>
JS判断当前DOM树是否加载完毕
查看>>