python装饰器使用方法实例

 更新时间:2013年11月21日 14:59:30   作者:  
这篇文章主要介绍了python装饰器的使用方法,大家参考使用

什么是python的装饰器?

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

最能说明装饰器的例子如下:

复制代码 代码如下:

#-*- coding: UTF-8 -*-
import time

def foo():
    print 'in foo()'

# 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法
def timeit(func):

    # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print 'used:', end - start

    # 将包装后的函数返回
    return wrapper

foo = timeit(foo)
foo()

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()

这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>,这个理解起来很简单。

相关文章

  • Django实现基于类的分页功能

    Django实现基于类的分页功能

    这篇文章主要为大家详细介绍了Django实现基于类的分页功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • python函数装饰器用法实例详解

    python函数装饰器用法实例详解

    这篇文章主要介绍了python函数装饰器用法,以实例形式较为详细的分析了Python函数装饰器的常见使用技巧,需要的朋友可以参考下
    2015-06-06
  • 学习python (1)

    学习python (1)

    学习python (1)...
    2006-10-10
  • python-httpx的具体使用

    python-httpx的具体使用

    HTTPX是Python3的功能齐全的HTTP客户端,它提供同步和异步API,本文主要介绍了python-httpx的具体使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • python发送邮件功能实现代码

    python发送邮件功能实现代码

    这篇文章主要为大家详细介绍了python发送邮件功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • Python读取CSV文件的四种方法总结

    Python读取CSV文件的四种方法总结

    这篇文章主要介绍了Python读取CSV文件的四种方法, 使用 csv 模块,使用 numpy 库,使用pandas库,使用标准库中的 csv 模块这四种方法,文章通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 详解Python3中的多重继承和混入类

    详解Python3中的多重继承和混入类

    Python原生支持多重继承,这使得我们可以从多个父类中继承属性和方法,在本文中,我们将介绍Python中多重继承的概念,并讨论在实际情况下可能遇到的坑,我们还将讨论如何使用混入类来避免这些问题,需要的朋友可以参考下
    2023-05-05
  • jupyter notebook内核启动失败问题及解决方法

    jupyter notebook内核启动失败问题及解决方法

    这篇文章主要介绍了解决jupyter notebook内核启动失败问题,本文给大家介绍了问题原因分析及解决方案,图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Python中为什么要用self探讨

    Python中为什么要用self探讨

    这篇文章主要介绍了Python中为什么要用self探讨,本文讲解了Python要self的理由、为何Python给self赋值而你不必给self赋值?等内容,需要的朋友可以参考下
    2015-04-04
  • matlab和Excel的数据交互操作(非xlsread和xlswrite)

    matlab和Excel的数据交互操作(非xlsread和xlswrite)

    在使用MATLAB时,可能会遇到很多表格数据的处理,有时MATLAB也需要利用现存的表格数据实现操作目的,下面这篇文章主要给大家介绍了关于matlab和Excel的交互操作的相关资料,非xlsread和xlswrite,需要的朋友可以参考下
    2021-08-08

最新评论