zoukankan      html  css  js  c++  java
  • 传说中Python最难理解的点|看这完篇就够了

    今天我就带领大家由浅入深的去窥探一下,这个装饰器到底是何方神圣,看完本篇,装饰器就再也不是难点了.

    1.什么是装饰器

    网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象

    每个人都有的内裤主要是用来遮羞,但是到了冬天它没法为我们防风御寒,肿木办?

    我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了。于是聪明的人们发明长裤

    在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后再也不冷了

    装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效

    2.装饰器的前传4步曲

    为什么讲装饰器要放在入门篇的末尾讲呢,因为这货太难了,里面有许多前提要懂。Python的函数相信大家都懂了,但是大家知不知道函数也是一种对象,可以像参数一样传递,我们看下面的例子吧:

    1)函数也是对象

    def message(word='hello'):

    return word.upper()+'!'

    print message()

    >>

    HELLO!

    my_message=message

    print my_message

    >>

    print my_message()

    >>

    HELLO!

    也就是说message可以赋值给另外一个变量

    2)函数可以嵌套,定义在另外一个函数内部

    def show():

    print 'Run in show()'

    def message(word='hello'):

    return word

    print message()

    show()

    >>

    Run in show()

    hello

    message可以嵌套在show函数里面,调用show的时候也会跑下message函数

    3)函数作为参数返回

    一个函数还可以当做另外一个函数的返回值,不信看下面这个例子:

    >>

    hello...

    4)函数作为参数传入

    我们先创建一个getName函数,然后把这个函数当做参数传递给foo函数

    >>

    I will call the getName function later

    leo

    3.装饰器的真面目

    1).经过前面几步,大家应该理解了函数可以作为参数传入,也可以当参数返回,而且还可以嵌套

    装饰器其实就是对函数进行再次包装,它能够在不改变函数的前提下,增加函数的功能,可以在函数执行之前或者执行之后执行一段代码

    a_stand_alone_function()

    >>

    I am a stand alone function,don't you dare modify me

    a_stand_alone_function_decorated=my_new_decorator(a_stand_alone_function)

    a_stand_alone_function_decorated()

    >>

    Before the function runs

    I am a stand alone function,don't you dare modify me

    After the function runs

    2).使用装饰器

    看这样简单吧,装饰器有一个语法糖@,直接@my_new_decorator就把上面一坨代码轻松化解了,这就是Pythonic的代码,简洁高效

    其实相当于:

    another_stand_alone_function=my_new_decorator(another_stand_alone_function)

    4.为什么要使用装饰器

    装饰器提供了一些和代码维护性和审美相关的优点。并且作为结构化工具,装饰器自然地促进了代码的封装,这减少了冗余性并使得未来维护和扩展变得更容易。

    如果大家学过Django和Flask就会知道,web框架里面大量的使用装饰器进行代码的封装.我们下面看一个简单的例子:

    我们有一个主题函数word()是输出一个字符串,我们有一个函数是把字符串变粗体,另外一个是变斜体。有了装饰器之后,我们可以非常灵活的组合,扩展函数的功能:

    输出<b><i>hello<i><b>

    有一点要注意,就是装饰器的顺序变了,结果是不一样的.

    @makeitalic

    @makebold

    def word():

    return "hello"

    print word()

    输出<i><b>hello<b><i>

  • 相关阅读:
    程序员兄弟们,我们的基本素质怎么样?
    从GridView中直接导出数据到Excel文件 处理导出乱码 类型“GridView”的控件“XXXX”必须放在具有 runat=server 的窗体标记内。”的异常
    在SQLServer 2005附加SQLServer 2008数据库异常处理
    大型企业如何搭建私有云计算平台
    GIS在石油行业中的应用
    win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程
    三维空间数据模型及结构
    oracle适配器连接不上解决方案
    单态设计模式
    java实现排序的几种方法
  • 原文地址:https://www.cnblogs.com/l520/p/10271649.html
Copyright © 2011-2022 走看看