装饰器

作者: 00cadc01cbc1 | 来源:发表于2015-12-02 15:46 被阅读43次

最近在看廖雪峰老师的关于装饰器的教程, 写的非常好,链接:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819879946007bbf6ad052463ab18034f0254bf355000#0

1. 函数是可作为变量传递的。
import datetime
def now():
  print datetime.datetime.now()

f = now()
f()
>>> 2016-05-05 17:03:47.370000
2. 不带参数的装饰器

@functools.wrap()函数把原始函数的name等属性复制到wrapper()函数中,
否则,有些依赖函数签名的代码执行就会出错

#定义装饰器
import datetime
import functools


def log(func):
  @functools.wrap(func)
  def wrapper(*args, **kwrags):
    print 'call %s' % func.__name__
    return func(*args, **kwrags)
return wrapper

@log
def now():
  print datetime.datetime.now()
>>> call now()
>>> 2016-05-05 17:03:47.370000
3 带参数的装饰器
def log(text):
  def decorator(func):
    @functools.wrap(func)
    def wrapper(*args, **kwrags):
      print '%s %s' %s(text, func.__name__)
      return func(*args, **kwrags)
    return wrapper
  return decorator

@log('Hangzhou')
def now():
  print datetime.datetime,now()
>>> Hangzhou now
>>> 2016-05-05 17:03:47.370000

4. 练习实现一个能在函数调用的前后打印出'begin call'和'end call'的日志。

def call_print(func):
  @functools.wrap(func)
  def wrapper(*args, **kwrags):
    print '%s begin call' % func.__name__
    res = func(*args, **kwrags)
    print '%s end call' % func.__name__
    return res
  return wrapper

@call_print
def now():
  print datetime.datetime.now()
 
  >>>  now begin call
  >>> 2016-05-05 17:03:47.370000
  >>> now end call
5 编写一个即支持带参数的修饰器 又支持不带参数的修饰器
def call_print(text):
  if callable(text):
    @functools.wrap(func)
    def wrapper(*args, **kwrags):
      print '%s begin call' % func.__name__
      res = func(*args, **kwrags)
      print '%s end call' % func.__name__
      return res
    return wrapper
  else:
    def decorator(func):
      @functools.wrap(func)
      def wrapper(*args, *kwrags):
        print '%s begin call' % func.__name__
        res = func(*args, **kwrags)
        print '%s end call' % func.__name__
        return res
      return wrapper
    return decorator

@log
 def now():
    print datetime.datetime.now()
@log('Hangzhou')
 def now():
    print datetime.datetime.now()

>>> now begin call
>>>2016-05-05 17:03:47.370000
>>> now end call

>>> Hangzhou begin call 
>>> 2016-05-05 17:03:47.370000
>>> Hangzhou end call 

**************

#装饰器带参数,并且包装函数带参数
def deco(arg):
  def _deco(func):
    def __deco(*args, **kwargs):
        print('befor %s called [%s].' % (func.__name__, arg))
        ret = func(*args, **kwargs)
        print('after %s called [%s].' % (func.__name__, arg))
        return ret
    return __deco
  return _deco
@deco('mymodule')
def myfunc(a, b):
print('myfunc() called.')
return a+b
print myfunc(10, 199)

参考
http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html

相关文章

  • 装饰器

    """@装饰器- 普通装饰器- 带参数的装饰器- 通用装饰器- 装饰器装饰类- 内置装饰器- 缓存装饰器- 类实现...

  • typescript 五种装饰器

    装饰器类型 装饰器的类型有:类装饰器、访问器装饰器、属性装饰器、方法装饰器、参数装饰器,但是没有函数装饰器(fun...

  • python——装饰器详解

    一、装饰器概念 1、装饰器 装饰器:一种返回值也是一个函数的函数,即装饰器。 2、装饰器目的 装饰器的目的:装饰器...

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • 装饰器

    装饰器 decorator类装饰器 带参数的装饰器 举例(装饰器函数;装饰器类;有参与无参) https://fo...

  • TypeScript装饰器

    前言 装饰器分类 类装饰器 属性装饰器 方法装饰器 参数装饰器需要在tsconfig.json中启用experim...

  • python之装饰器模版

    装饰器的作用:装饰器即可以装饰函数也可以装饰类。装饰器的原理:函数也是对象 1.定义装饰器 2.使用装饰器假设de...

  • 装饰器实验

    装饰器实验 说明 ts内包含了四个装饰器,类装饰器、属性装饰器、函数装饰器、参数装饰器,本文中测试一下其的使用。 ...

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

网友评论

      本文标题:装饰器

      本文链接:https://www.haomeiwen.com/subject/vktshttx.html