装饰器,又名函数修饰符。笔者觉得函数修饰符,这个名字更能直观的反应他的作用。

函数修饰符语法特征 :
         @ + 修饰符

函数修饰符的装饰对象:
        函数修饰符,就是说他修饰的是函数,而不是其他的东西,不是类,也不是变量,就函数而已!

修饰符本身可以是哪些东西:
   1、函数标签(C/C++的说法:函数指针)
   2、带有魔法方法__call__() 的类的类名
   3、Ptyhon内置修饰符

修饰符的本质:
        一个可以接受函数作为参数的函数

函数修饰符的工作原理:
   当一个函数被一个修饰符修饰之后,再次调用该函数时,该函数会作为一个参数传入该修饰符。结果是该修饰符返回的函数被调用

1、修饰符为函数标签(C/C++的说法:函数指针)的例子:

import time

def timeslong(func):
def call():
start = time.clock()
print("It's time starting ! ")
func()
print("It's time ending ! ")
end = time.clock()
return "It's used : %s ." % (end - start)
return call @timeslong
def f():
y = 0
for i in range(10):
y = y + i + 1
print(y)
return y print(f())

总结:当修饰符为函数便签时,注意该函数必须返回的是一个函数便签。因为,修饰符的本质是
        一个可以接受函数作为参数的函数。

2、修饰符为带有魔法方法__call__() 的类的类名的例子:

import time

class timeslong(object):
def __init__(self,func):
self.f = func
def __call__(self):
start = time.clock()
print("It's time starting ! ")
self.f()
print("It's time ending ! ")
end = time.clock()
return "It's used : %s ." % (end - start) @timeslong
def f():
y = 0
for i in range(10):
y = y + i + 1
print(y)
return y print(f())

总结:当修饰符为类名时,注意该类必须有__call__的实例方法,被修饰的函数被调用时,会自动被传入__call__,之后__call__被调用。

3、修饰符为Ptyhon内置修饰符的例子:(这个目前感觉没啥用,先copy小甲鱼的啦)         内置的修饰符有三个,分别是 staticmethod、classmethod 和 property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多。

class Hello(object):
def __init__:
... @classmethod
def print_hello(cls):
print "Hello"

classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。

谈谈对Python装饰器的理解的更多相关文章

  1. 转发对python装饰器的理解

    [Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考   原文  http://blog.csdn.net/sxw3718401/article/details/3951958 ...

  2. python 装饰器的理解以及类装饰器

    python装饰器的作用就是在不改变原有函数结构的情况下给该函数增加一个新功能,就是不入侵到原来函数里面修改代码给其增加一个新功能 先看代码 def out(fn): def inner(*args, ...

  3. python 装饰器 (个人理解就是前置的内建函数)

    感谢有篇文件详细介绍[简单 12 步理解 Python 装饰器]http://python.jobbole.com/85056/ 1.首先介绍内建函数 2.转换为装饰器 3.执行顺序 4.装饰器实用

  4. python装饰器的理解

    学习python,发现装饰器是一个比较难理解的地方. 下面用代码来说明. 装饰器的作用是为了切面编程(AOP).这种编程在java上有很多实现方式.下面直接说明吧: 1.作为装饰器的函数至少有两个de ...

  5. 总结了11条,我对Python 装饰器的理解

    对于每一个学习 Python 的同学,想必对 @ 符号一定不陌生了,正如你所知, @ 符号是装饰器的语法糖,@符号后面的函数就是我们本文的主角:装饰器. 装饰器放在一个函数开始定义的地方,它就像一顶帽 ...

  6. python 装饰器的理解

    一. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷 ...

  7. Python装饰器的通俗理解

    转载:http://blog.csdn.net/u013471155 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...

  8. (一)Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  9. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

随机推荐

  1. Android Studio动态调试smali代码

    工具: Android Studio版本: 3.0.1 smalidea插件: https://github.com/JesusFreke/smali/wiki/smalidea. 反编译工具:本节先 ...

  2. jboss-as- 7.1.1.Final配置jndi数据源

    初次使用jboss7.1.1.final部署项目,遇到了很多困难,最终通过查看官方文档和网上资料得以解决,特此记录一下. error information 2016-05-12 12:53:20 J ...

  3. EJB2.0 ejb-jar.xml配置文件详解

    <ejb-jar><!--EJB发布描述器的根元素,它包含一个可选的EJB-JAR文件的描述,可选显示的名称,可选小图标的文件名,可选的大图标的文件名,必须的所有被包含的enterp ...

  4. search文件中的config

    config文件中出现这句话时,代表该部分search应写成文件中封装好的search部分.即: var search = null;     this.search = search;     se ...

  5. 实战演示疑惑 mysql insert到底加什么锁

    innodb的事务隔离级别是可重复读级别且innodb_locks_unsafe_for_binlog禁用,也就是说允许next-key lock 实验来自网上. ( 如果你没有演示出来,请check ...

  6. pt-osc全解pt-online-schema-change

    MySQL 大字段的DDL操作:加减字段.索引.修改字段属性等,在5.1之前都是非常耗时耗力的,特别是会对MySQL服务产生影响.在5.1之后随着Plugin Innodb的出现在线加索引的提高了很多 ...

  7. firefox(火狐)和Chrome(google)浏览器清空缓存操作的方法指引

    摘要说明: 1.系统做升级更新,更新了css和js 2.系统更新有,因为缓存问题,有客户反馈新增功能不能使用 3.所以要清空缓存,提供火狐和谷歌浏览器清空缓存的操作指引 4.附:代码层面的清空缓存方案 ...

  8. redis 持久化与备份策略

    持久化(persistence) 本文是 Redis 持久化文档 的中文翻译. 这篇文章提供了 Redis 持久化的技术性描述,推荐所有 Redis 用户阅读. 要更广泛地了解 Redis 持久化,以 ...

  9. [python]python官方原版编码规范路径

    1.进入python官方主页:https://www.python.org/ 2.按如下图进入PEP Index ​ 3.选择第8个,即为python的规范 ​

  10. 13.4SolrCloud集群使用手册之CRUD

    转载请出自出处:http://www.cnblogs.com/hd3013779515/ Student.java package cn.ljh.ssm.test; import org.apache ...