Python 函数修饰符(装饰器)的使用

1.  修饰符的来源
修饰符是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。

修饰符是解决这类问题的绝佳设计,有了修饰符,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,修饰符的作用就是为已经存在的对象添加额外的功能。

如下:

  1. import time
  2. def
    timeslong(func):
  3. start = time.clock()
  4. print("It's time starting ! ")
  5. func()
  6. print("It's time ending ! ")
  7. end = time.clock()
  8. return "It's used : %s ." % (end - start).

上面的程序中,定义了一个函数,对另外一个对象的运行时间进行计算,如果采用通常的方式需要将 func() 重新在 timeslong 中重新写一遍。为了简化这种操作,便提出了修饰符的概念。

如下:

  1. import time
  2. def
    timeslong(func):
  3. def call():
  4. start = time.clock()
  5. print("It's time starting ! ")
  6. func()
  7. print("It's time ending ! ")
  8. end = time.clock()
  9. 10.   return "It's used : %s ." % (end -
    start)
  10. return call

13. @timeslong

14. def f():

  1. 15.  
      y = 0
  2. 16.  
      for i in range(10):
  3. 17.  
          y = y + i + 1
  4. 18.  
          print(y)
  5. 19.  
      return y

21. print(f())

这样出现便不用再函数内部再进行嵌入函数,通过 @timeslong 对其进行修饰达到目的,是整个代码美观,而且少些部分代码

修饰符也可以通过类来进行使用,共享该类,如下为一个实例:

  1. class
    timeslong(object):
  2. def
    __init__(self,func):
  3. self.f = func
  4. def
    __call__(self):
  5. start = time.clock()
  6. print("It's time starting ! ")
  7. self.f()
  8. print("It's time ending ! ")
  9. end = time.clock()
  10. return "It's used : %s ." % (end - start)

12. @timeslong

13. def f():

  1. 14.  
      y = 0
  2. 15.  
      for i in range(10):
  3. 16.  
          y = y + i + 1
  4. 17.  
          print(y)
  5. 18.  
      return y

20. print(f())

2.  Python内置的修饰符

内置的修饰符有三个,分别是 staticmethod、classmethod 和 property,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多。

  1. class
    Hello(object):
  2. def __init__:
  3. ...
  4. @classmethod
  5. def
    print_hello(cls):
  6. print("Hello")

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

Python 函数修饰符(装饰器)的使用的更多相关文章

  1. python函数修饰符@的使用

    python函数修饰符@的作用是为现有函数增加额外的功能,常用于插入日志.性能测试.事务处理等等. 创建函数修饰符的规则:(1)修饰符是一个函数(2)修饰符取被修饰函数为参数(3)修饰符返回一个新函数 ...

  2. Python函数篇:装饰器

    装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...

  3. python函数与方法装饰器

    之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...

  4. python函数学习之装饰器

    装饰器 装饰器的本质是一个python函数,它的作用是在不对原函数做任何修改的同时,给函数添加一定的功能.装饰器的返回值也是一个函数对象. 分类: 1.不带参数的装饰器函数: def wrapper( ...

  5. python函数:叠加装饰器、迭代器、自定义迭代器、生成式

    一.叠加多个装饰器二.迭代器三.自定义迭代器四.xxx生成式 一.叠加多个装饰器 # 加载装饰器就是将原函数名偷梁换柱成了装饰器最内层那个wrapper函数 # 在加载完毕后,调用原函数其实就是在调用 ...

  6. python 函数基础及装饰器

    没有参数的函数及return操作 def test1(): print ("welcome") def test2(): print ("welcomt test2&qu ...

  7. python函数修饰器(decorator)

    python语言本身具有丰富的功能和表达语法,其中修饰器是一个非常有用的功能.在设计模式中,decorator能够在无需直接使用子类的方式来动态地修正一个函数,类或者类的方法的功能.当你希望在不修改函 ...

  8. python学习笔记(五):装饰器、生成器、内置函数、json

    一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...

  9. python笔记5:装饰器、内置函数、json

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

随机推荐

  1. [CSS]关于z-index与position的一次奇异经历

    前言: 前不久,同事S遇到了一个关于position和z-index的问题. 他折腾了一天没搞定,群发了邮件寻求帮助, 我一开始以为很简单,就主动说帮忙,简单尝试之后,才发现貌似没那么简单. 问题主要 ...

  2. 2.3 Python语言基础

    2.3 Python语言基础 1 语言语义(Language Semantics) 缩进,而不是括号 Python使用空格(tabs or spaces)来组织代码结构,而不是像R,C++,Java那 ...

  3. Payment:微信支付配置文件设置说明

    项目GitHub地址:https://github.com/helei112g/payment 微信支付个人觉得在帐号设置上有些麻烦,帐号太多啦,支付宝目前就是一个应用基本涵盖了所有的接口开发. 可能 ...

  4. PHP中对用户身份认证实现两种方法

    用户在设计和维护站点的时候,经常需要限制对某些重要文件或信息的访问.通常,我们可以采用内置于WEB服务器的基于HTTP协议的用户身份验证机制.     当访问者浏览受保护页面时,客户端浏览器会弹出对话 ...

  5. Javascript Number.MIN_VALUE

    一.Number.MIN_VALUE属性属于静态Number对象.这代表了尽可能小的正数的JavaScript可以工作的常量. 该常量的实际值是 5 x 10-324 语法访问属性: var val ...

  6. Hadoop学习之路(九)HDFS深入理解

    HDFS的优点和缺点 HDFS的优点 1.可构建在廉价机器上 通过多副本提高可靠性,提供了容错和恢复机制 服务器节点的宕机是常态   必须理性对象 2.高容错性 数据自动保存多个副本,副本丢失后,自动 ...

  7. ES6新特性6:模块Module

    本文摘自ECMAScript6入门,转载请注明出处. 一.Module简介 ES6的Class只是面向对象编程的语法糖,升级了ES5的构造函数的原型链继承的写法,并没有解决模块化问题.Module功能 ...

  8. pl/sql连接远程oracle

    1.找到oracle安装程序下的网络配置助手 2.选中本地net服务,进行添加 3.输入远程oracle服务名 4.选中tcp协议 5.输入远程oracle的ip地址 6.在网络服务名处,随便输入一个 ...

  9. sql三表查询

    情景: student  id    stname    sex score   scoreid  stname  birth course id    coursename  age 简单说明  a ...

  10. 使用CSS3的“transition ”属性控制长宽度的缓慢变化

    有时候我们可能会想要改变某个资源信息的长宽度,比如改变某个div的宽度,而且需要让这个宽度缓慢改变,而不是突然就改变了.这时候你可能会想到使用jquery的animate()函数,不过这个方法既得引用 ...