`

python 函数装饰器例子

 
阅读更多
#! coding=utf-8

#装饰器

'''
经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,
有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
'''


import time

def timeit(func):
    def wrapper(a):
        start = time.clock()
        func(1,2)
        end =time.clock()
        print 'used:', end - start
        print a

    return wrapper

@timeit   #  foo = timeit(foo)完全等价, 使用之后,foo函数就变了,相当于是wrapper了
def foo(a,b):
    pass


#不带参数的装饰器
# wraper 将fn进行装饰,return wraper ,返回的wraper 就是装饰之后的fn
def test(func):
    def wraper():
        print "test start"
        func()
        print "end start"
    return wraper

@test
def foo():
    print "in foo"
foo()
"""
输出:
test start

in foo
end start
"""


#装饰器修饰带参数的函数
def parameter_test(func):
    def wraper(a):
        print "test start"
        func(a)
        print "end start"
    return wraper

@parameter_test
def parameter_foo(a):
    print "parameter_foo:"+a

#parameter_foo('hello')

"""
输出
>>>
test start

parameter_foo:hello
end start
"""


#装饰器修饰不确定参数个数的函数
def much_test(func):
    def wraper(*args, **kwargs):
        print "test start"
        func(*args, **kwargs)
        print "end start"
    return wraper

@much_test
def much1(a):
    print a

@much_test
def much2(a,b,c,d ):
    print a,b,c,d

much1('a')
much2(1,2,3,4)
"""
输出
test start
a
end start
test start
1 2 3 4
end start
"""


#带参数的装饰器   ,再包一层就可以了

def tp(name,age):
    def much_test(func):
        print 'in much_test'
        def wraper(*args, **kwargs):
            print "test start"
            print str(name),'at:'+str(age)
            func(*args, **kwargs)
            print "end start"
        return wraper
    return much_test

@tp('one','10')
def tpTest(parameter):
    print parameter
tpTest('python....')
"""
输出
in much_test
test start
one at:10
python....
end start
"""



class locker:
    def __init__(self):
        print("locker.__init__() should be not called.")

    @staticmethod
    def acquire():
        print("locker.acquire() called.(这是静态方法)")

    @staticmethod
    def release():
        print("locker.release() called.(不需要对象实例")

def deco(cls):
    '''cls 必须实现acquire和release静态方法'''
    def _deco(func):
        def __deco():
            print("before %s called [%s]." % (func.__name__, cls))
            cls.acquire()
            try:
                return func()
            finally:
                cls.release()
        return __deco
    return _deco

@deco(locker)
def myfunc():
    print(" myfunc() called.")

#myfunc()
#myfunc()






class mylocker:
    def __init__(self):
        print("mylocker.__init__() called.")

    @staticmethod
    def acquire():
        print("mylocker.acquire() called.")

    @staticmethod
    def unlock():
        print("  mylocker.unlock() called.")

class lockerex(mylocker):
    @staticmethod
    def acquire():
        print("lockerex.acquire() called.")

    @staticmethod
    def unlock():
        print("  lockerex.unlock() called.")

def lockhelper(cls):
    '''cls 必须实现acquire和release静态方法'''
    def _deco(func):
        def __deco(*args, **kwargs):
            print("before %s called." % func.__name__)
            cls.acquire()
            try:
                return func(*args, **kwargs)
            finally:
                cls.unlock()
        return __deco
    return _deco

class example:
    @lockhelper(mylocker)
    def myfunc(self):
        print(" myfunc() called.")
    @lockhelper(mylocker)
    @lockhelper(lockerex)
    def myfunc2(self, a, b):
        print(" myfunc2() called.")
        return a + b

if __name__=="__main__":
    a = example()
    a.myfunc()
    print(a.myfunc())
    print(a.myfunc2(1, 2))
    print(a.myfunc2(3, 4))
分享到:
评论

相关推荐

    Python 装饰器实现DRY(不重复代码)原则

    在Python中,装饰器本质上是一个函数,它能够接收另一个函数作为参数,并返回一个新的函数,这个新的函数能够添加一些额外的功能,而不需要修改原函数的代码。装饰器的实现基于闭包(一个函数记住了它被创建时所在的...

    Python装饰器限制函数运行时间超时则退出执行

    ### Python装饰器限制函数运行时间超时则退出执行 在实际开发过程中,有时我们需要对某些函数的执行时间进行限制,即如果一个函数的执行超过了预设的时间,那么该函数将被强制停止执行,以避免长时间的阻塞或不必要...

    Python @函数装饰器及@staticmethod,@classmethod.docx

    ### Python 函数装饰器及其应用 #### 一、函数装饰器概述 在 Python 中,**函数装饰器**是一种特殊的设计模式,它允许开发者在不修改原函数代码的情况下为函数增加额外的功能。装饰器本质上是一个接收函数作为参数...

    Python编程 函数装饰器.pdf

    **Python函数装饰器详解** 装饰器是Python编程中一种强大的工具,它允许我们在不修改原始函数源代码的情况下,为其添加额外的功能或行为。这得益于Python的动态性和元编程特性。装饰器是设计模式中装饰模式的实现,...

    Python-仅用一个装饰器就可以跟踪一个Python函数执行的本地上下文

    本文将深入探讨如何使用一个装饰器来跟踪Python函数执行的本地上下文,这对于调试、日志记录、性能分析等场景非常有用。 首先,让我们了解什么是装饰器。在Python中,装饰器本质上是一个接收函数作为参数并返回新...

    python装饰器的4中类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类

    函数装饰器是最基础的形式,它是一个接收函数并返回新函数的普通函数。装饰器在定义后通常放置在目标函数之上,通过`@decorator_name`语法糖来调用。 ```python def simple_decorator(func): def wrapper(): ...

    python函数修饰符@的使用方法解析

    文中给出了一个修正后的日志装饰器例子,它可以处理被装饰函数带有任意参数的情况。 此外,还提到了如何创建带有参数的装饰器。此时,需要定义一个装饰器工厂函数,这个工厂函数返回一个装饰器,该装饰器可以接收...

    Python3.5装饰器原理及应用实例详解

    接下来通过一个简单的例子来展示如何使用装饰器来记录函数的执行时间。 **2.1 示例代码** ```python import time # 定义一个装饰器函数,用于计算并打印函数执行的时间 def timer(func): def wrapper(*args, **...

    Python装饰器模式学习demo

    Python装饰器是一种高级编程技巧,它允许我们修改或增强函数、方法或类的行为,而无需对原始代码进行任何更改。装饰器本质上是一个接收一个函数作为输入并返回一个新的函数的函数。这种设计模式在Python中非常常见,...

    Python之装饰器共6页.pdf.zip

    Python中的装饰器是一种高级函数,它是Python语言的特色特性,用于修改或增强其他函数的功能,而无需改动原函数的代码。装饰器本质上是函数,它能够接收一个函数作为参数,并返回一个新的函数。在Python中,装饰器的...

    python函数装饰器之带参数的函数和带参数的装饰器用法示例

    函数装饰器是Python语言中的一项重要特性,它允许用户在不修改函数本身定义的情况下,增加函数的功能。而带参数的函数装饰器,顾名思义,就是在装饰器中可以传入参数,使得装饰器本身也具备了更高的灵活性和功能扩展...

    python之装饰器,多重装饰器,多层函数装饰器

    Python中的装饰器是一种强大的工具,它允许我们修改或增强函数、类或其他可调用对象的行为,而无需直接改动它们的源代码。装饰器基于闭包的概念,因此理解闭包是学习装饰器的关键。 闭包是一种特殊的函数,它定义在...

    装饰器---python.pdf

    装饰器是Python中一个强大的设计模式,它允许用户在不改变原有函数定义的情况下,增加额外的功能。本篇文章将深入剖析Python装饰器的引入、作用、定义方法、以及如何应用装饰器进行实际编程。 首先,装饰器是面向...

    python类装饰器装饰方法通用编码模型分析.zip

    对于类装饰器,它们的工作方式与函数装饰器相似,但接收的是类而不是函数。类装饰器通常需要实现 `__call__` 方法,这样当类实例被调用时,就可以执行相应的逻辑。例如: ```python class ClassDecorator: def __...

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

    Python函数装饰器是一种强大的工具,它允许我们修改或增强函数的行为,而不改变其原始代码。装饰器本质上是一个接收函数作为参数并返回新函数的函数。它们在Python中广泛用于实现如日志记录、性能测试、权限控制等...

    python使用装饰器作日志处理的方法

    写了2个装饰器日志的例子, 第一个是不带参数的装饰器用法示例,功能相当于给函数包了层异常处理,第二个是带参数的装饰器用法示例,将日志输出到文件。 ``` #coding=utf8 import traceback import logging from ...

    详解Python装饰器由浅入深

    在这个例子中,`error_handler`装饰器为`f1`函数添加了异常处理功能,如果`f1`执行过程中抛出异常,装饰器会捕获并打印错误信息,而无需在`f1`函数内部写异常处理代码。 通过深入理解装饰器,我们可以更有效地组织...

    Python函数学习.zip

    在"Python函数学习.zip"这个压缩包中,可能包含了关于Python函数的各种学习资源,如教程、示例代码或者练习题。为了深入理解Python函数,我们需要探讨以下几个关键知识点: 1. **定义函数**: 在Python中,我们...

    python 装饰器(示例)

    装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。这种设计模式在Python中被广泛应用,特别是在处理日志、性能测试、事务处理、缓存等...

Global site tag (gtag.js) - Google Analytics