由于函数也是一个对象,既然是对象就可以将它赋给变量,通过变量来调用该函数

def now():
print('2016-01-01') f = now #注意,这里不能带(),函数带上()表示执行函数的意思
f.() #这里带上括号了,就是执行该函数,通过变量f调用 2016-01-01

函数有一个__name__方法,用来显示函数的名字:

>>> now.__name__
'now'
>>> f.__name__
'now'
>>>

OK,接下来详细介绍一下装饰器,因为装饰器比较抽象,所以我们通过代码来理解一下:

还是先假设一个情景:A公司有一个系统,用户登录后,可以访问主页,可以听音乐,可以看视频,源码是这样的:

def home(name):
print("Welcom %s to home!" % name) def music(name):
print("Welcom %s to music!" % name) def video(name):
print("welcome %s to video!" % name)

如果用户张三想看视频,那么通过如下方式:

video("zhangsan")

A公司这个系统运营了很久,有了很多用户,越来越大,后来维护费用太高,A公司渐渐没钱了, 这时公司决定对用户进行收费, 那么就需要加上验证功能, 交了钱的用户可以听音乐,看视频, 不交钱的只能看看主页,但是又不能改变用户的习惯, 用户原来使用video(“张三”) 来看视频,那修改以后也得这样看视频;我们都知道,已经运行的代码是不可以直接修改的,那我们怎么办呢?

那既然不能修改原来的代码,那我就在原来的代码外面写一个验证的函数:

def login(func):         #接收一个函数作为参数
print("用户验证通过。。。。")
return func #将函数返回

接下来就是让用户在看视频之前先运行login函数来验证身份,那我们这样进行赋值:

video = login(video)

当用户张三要看视频的时候,还是按照来的方法

video("张三")

当用户敲完回车后,发生了什么,分析一下:

这里video(“张三”) 实际上就是 login(video)(“张三”)

拆分一下,先看看login(video)的执行结果:

先打印用户验证通过的信息,实际就是验证了用户的身份。然后将video的函数返回,注意返回原是函数(没有带括号);

然后变成了video(“张三”),  看到了视频。其实就是在看视频之前执行了身份验证。

理解了之后,就好说了,装饰器实际上就是干了最后一步的活,即video = login(video)。 看一下,装饰器是怎么用的,还是上面的例子,login()函数已经写好了,接下来要用到music和video上

@login
def music(name):
print("Welcom %s to music!" % name) @login
def video(name):
print("welcome %s to video!" % name)

这样看起来好像很完美,但是实际上是有问题的;为什么呢?

我们仔细想一下验证过程,因为这里是模拟的,没有任何验证程序,只是打印了验证通过,而实际中,验证是需要有用户名密码信息的,但在login(tv)时,只是把tv这个函数传递给了login, 用户名”张三”根本没有传递进去,又如何验证呢??  接下来的一篇介绍如何传递多参数。

python(4) - 装饰器的更多相关文章

  1. Python各式装饰器

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  2. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

  3. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

  4. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  5. 两个实用的Python的装饰器

    两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...

  6. python 基础——装饰器

    python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...

  7. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

  8. python基础—装饰器

    python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...

  9. 详解Python的装饰器

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  10. 关于python的装饰器(初解)

    在python中,装饰器(decorator)是一个主要的函数,在工作中,有了装饰器简直如虎添翼,许多公司面试题也会考装饰器,而装饰器的意思又很难让人理解. python中,装饰器是一个帮函数动态增加 ...

随机推荐

  1. 怎么在 html 中 动态的加载一个 script

    var script = document.createElement( 'script' );script.type = 'text/javascript';script.src = bodyStr ...

  2. socket.io的抽象实现:engine.io

    engine.io是一个socket.io的抽象实现,作为socket.io的服务器和浏览器之间交换的数据的传输层.它不会取代Socket.IO,它只是抽象出固有的复杂性,支持多种浏览器,设备和网络的 ...

  3. openstack 云平台API

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABVYAAAKrCAIAAACV8EEMAAAgAElEQVR4nOydeVgUaZ7n/W9299nd7n

  4. Java设计模式系列之单例模式

    单例模式的定义 一个类有且仅有一个实例,并且自行实例化向整个系统提供.比如,多程序读取一个配置文件时,建议配置文件时,建议配置文件封装成对象.会方便操作其中的数据,又要保证多个程序读到的是同一个配置文 ...

  5. pandas.DataFrame 中save方法

    In [5]: frame.save('frame_pickle') ----------------------------------------------------------------- ...

  6. 使用Jena RDF API 开发脚本语言管理资源描述框架模型

    摘要 资源描述框架(Resource Description Framework RDF)是一种以XML格式描述元数据的标准格式.Jena是一种用于将关系数据库或是文本文件中所表示的数据建立为元数据模 ...

  7. 集合引入(ArrayList、LinkedList)

    1.引入 代替数组固定大小操作不变 2.ArrayList 常用的操作(add,remove) 3.LinkedList 能实现一些特殊的操作(pop)

  8. 定义文档兼容性,让IE按指定的版本解析我们的页面

    作为开发人员,特别是作为Web的前端开发人员 ,最悲催的莫过于要不断的,不断的去调试各种浏览器的显示效果,而这其中最让人头痛的莫过于MS下的IE系列浏览器,在IE系列中的调试我们将会发现没有一个是好伺 ...

  9. Middleware课程01-概述

    中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源.中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯.是连接两个独立应用程序或独立系统的软件.相 ...

  10. C++ Caption

    主题 1. 设置控件的标题文本 2. 获取控件的标题文本     Caption属性 取得一个窗体的标题(caption)文字,或者一个控件的内容   红色的部分就是 Caption 标题   Set ...