码迷,mamicode.com
首页 > 编程语言 > 详细

python的装饰器

时间:2016-04-23 16:37:32      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:

什么是python的装饰器?

  网络上的定义:

    装饰器就是一函数,用来包装函数的函数,用来修饰原函数,将其重新赋值给原来的标识符,并永久的丧失原函数的引用。

  在google上搜索下python 装饰器 可以搜索到很多关于很多的关于装饰器的文章,一个很简单,最能说明装饰器的例子如下:

#-*- coding: GBK -*-
import time
 
def foo():
    print in foo()
    i =0
    while i<100000:
        i+=1
# 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法
def timeit(func):
     
    # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print used:, end - start
     
    # 将包装后的函数返回
    return wrapper
 
foo = timeit(foo)
foo()

结果:

in foo()
used: 0.00833883698712

 

@语法糖

python中提供了一个@符号的语法糖,用来简化上面的代码,他们的作用一样

import time
 
def timeit(func):
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print used:, end - start
    return wrapper
 
@timeit
def foo():
    print in foo()
 
foo()

结果:

in foo()
used: 4.93725834685e-05

这2段的代码是一样的,等价的。

内置的3个装饰器

他们分别是staticmethod,classmethod,property,他们的作用是分别把类中定义的方法变成静态方法,类方法和属性,如下:

class Rabbit(object):
     
    def __init__(self, name):
        self._name = name
     
    @staticmethod
    def newRabbit(name):
        return Rabbit(name)
     
    @classmethod
    def newRabbit2(cls):
        return Rabbit(‘‘)
     
    @property
    def name(self):
        return self._name

装饰器的嵌套:

就一个规律:嵌套的顺序和代码的顺序是相反的。

也是来看一个例子:

技术分享
#!/usr/bin/python
# -*- coding: utf-8 -*-

def makebold(fn):
    def wrapped():
        return "<b>" + fn() + "</b>"
    return wrapped

def makeitalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped

@makebold
@makeitalic
def hello():
    return "hello world"

print hello()
技术分享

返回的结果是:

<b><i>hello world</i></b>

为什么是这个结果呢?

1.首先hello函数经过makeitalic 函数的装饰,变成了这个结果<i>hello world</i>

2.然后再经过makebold函数的装饰,变成了<b><i>hello world</i></b>,这个理解起来很简单。

python的装饰器

标签:

原文地址:http://www.cnblogs.com/duanxz/p/5424830.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!