洗礼灵魂,修炼python(30)--装饰器(2)—>装饰器总结+进阶使用

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

 

装饰器

1.什么是装饰器?

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

还有两种理解是:

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

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

2.格式:

def func():
  suite
@func
def 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 inner
def outer2(func):
    def inner(*args,**kwargs):
        print("开始解决第一个项目问题")
        return func(*args,**kwargs) 
    return inner

def outer3(func):
    def inner(*args,**kwargs):
        print('开始解决第二个项目问题')
        return func(*args,**kwargs)
    return inner

@outer1
@outer2
@outer3
def 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'%num
myfunc1(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')

这是一个Bootstrap框架下的网页布局代码,其中包括三个部分,每个部分都包括一个标题和一段文字说明,如下所示: 第一个部分: <div class="col-lg-4 col-md-4"> <div class="event-info"> <h4 class="text-center slideanim">泡温泉</h4> <p class="eve slideanim">沙城是中国最大的温泉城市,有着丰富的温泉资源,每年吸引着大量的游客前来泡温泉。</p> </div> </div> 第二个部分: <div class="col-lg-4 col-md-4"> <div class="event-info"> <h4 class="text-center slideanim">菜被子</h4> <p class="eve slideanim">在沙城除了泡温泉,买葡萄最应该打卡沙城的特色小吃“菜被子”。不同于肉夹馍,月亮馍所有素的,荤的都要经过油锅的洗礼,刷上自制麻酱。咬一口食材酥脆,刷满麻酱的面饼与食材味道完美结合。上至孩子爸妈,下至刚上学的孩子,每个人到这来只有一个目的,那就是给自己味蕾一个交代。</p> </div> </div> 第三个部分: <div class="col-lg-4 col-md-4"> <div class="event-info"> <h4 class="text-center slideanim">葡萄采摘</h4> <p class="eve slideanim">沙城是葡萄之乡,葡萄种植历史悠久,品种丰富,每年9月份是葡萄采摘的季节,游客可以来到葡萄园,品尝新鲜的葡萄,体验采摘的乐趣。</p> </div> </div> 其中,col-lg-4 col-md-4表示该部分占用网页布局的4分之1,即一行3个部分。h4标签表示标题,p标签表示文字说明。slideanim是一个自定义的CSS动画效果类,可以实现文字和图片的动态滑入效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值