- 浏览: 497051 次
- 性别:
- 来自: 武汉
文章分类
- 全部博客 (335)
- VM (2)
- python 基础 (78)
- C (7)
- php (38)
- django (8)
- c++ (1)
- python 服务端编程 (21)
- ubuntu (1)
- linux (26)
- mysql (24)
- 缓存管理 (5)
- nginx (4)
- linux 命令行 (16)
- web (8)
- javascript (8)
- python 模块 (3)
- java (6)
- 面试题 (2)
- tornado (1)
- 运维 (10)
- 网络编程 (0)
- svn (5)
- css (1)
- mongodb (3)
- vim (8)
- infobright (1)
- shell (1)
- 算法 (2)
- redis (1)
最新评论
#! 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))
#装饰器
'''
经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,
有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
'''
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中threading模块的join函数
2014-06-27 13:39 6120oin的作用是众所周知的,阻塞进程直到线程执行完毕。通用的做 ... -
python中read() readline()以及readlines()用法
2014-06-23 15:47 1104http://www.cnblogs.com/qi09/a ... -
Python的垃圾回收机制
2014-06-20 17:01 1022http://blog.csdn.net/carolzha ... -
nohup python xx.py & 无输出信息
2014-03-04 23:23 1532python默认的print输出stdout是开启了buff ... -
python 获得一个月有多少天
2014-02-25 18:54 791在python的datetime模块中没有一个月有多少天的方 ... -
python json 中文 乱码
2014-02-21 14:31 1729ython的json.dumps方法默认会输出成这种格式&q ... -
error: byte-compiling is disabled.
2014-01-25 09:48 1523yum install gcc python-devel -
【转】centos python pip安装
2014-01-25 09:31 956http://heipark.iteye.com/blog ... -
python 的日志logging模块学习
2014-01-21 10:34 709http://www.cnblogs.com/dkblog/a ... -
logging.conf 理解
2014-01-20 21:15 741#基本上格式可以这么看,先定义用到的logger,hand ... -
[转】Python日志输出——logging模块
2014-01-20 20:07 1015http://blog.csdn.net/chosen0ne ... -
python时间和时间戳之间的转换
2014-01-20 13:43 9141)例如格式2012-07-31 00:01:18,根据该时 ... -
centos下更新Python版本的步骤
2014-01-18 19:00 895安装完CentOS5.9(Final)后,执行#Python ... -
Installing mysql-python on Centos
2014-01-16 19:27 748yum install MySQL-python -
pymongo 中文乱码问题
2014-01-08 20:32 6188原文地址: http://windkeepblow.bl ... -
TypeError: cannot save object of type <type 'str'>
2014-01-08 20:06 1108pymongo的save方法传入的值不是字典类型 -
VIM python 自动补全插件:pydiction
2014-01-03 23:02 910http://www.pythonclub.org/lin ... -
yum出现“No module named yum”错误解决方法
2013-12-22 16:29 19384安装了一个Python2.7,隔天发现yum无法使用,报错信 ... -
wsgi详解
2013-12-18 13:46 934http://blog.csdn.net/sraing/ar ... -
linux安装python2.7碰到问题
2013-12-17 15:13 3337centos 默认是2.4版本的python,重新安装py ...
相关推荐
在Python中,装饰器本质上是一个函数,它能够接收另一个函数作为参数,并返回一个新的函数,这个新的函数能够添加一些额外的功能,而不需要修改原函数的代码。装饰器的实现基于闭包(一个函数记住了它被创建时所在的...
### Python装饰器限制函数运行时间超时则退出执行 在实际开发过程中,有时我们需要对某些函数的执行时间进行限制,即如果一个函数的执行超过了预设的时间,那么该函数将被强制停止执行,以避免长时间的阻塞或不必要...
### Python 函数装饰器及其应用 #### 一、函数装饰器概述 在 Python 中,**函数装饰器**是一种特殊的设计模式,它允许开发者在不修改原函数代码的情况下为函数增加额外的功能。装饰器本质上是一个接收函数作为参数...
**Python函数装饰器详解** 装饰器是Python编程中一种强大的工具,它允许我们在不修改原始函数源代码的情况下,为其添加额外的功能或行为。这得益于Python的动态性和元编程特性。装饰器是设计模式中装饰模式的实现,...
本文将深入探讨如何使用一个装饰器来跟踪Python函数执行的本地上下文,这对于调试、日志记录、性能分析等场景非常有用。 首先,让我们了解什么是装饰器。在Python中,装饰器本质上是一个接收函数作为参数并返回新...
函数装饰器是最基础的形式,它是一个接收函数并返回新函数的普通函数。装饰器在定义后通常放置在目标函数之上,通过`@decorator_name`语法糖来调用。 ```python def simple_decorator(func): def wrapper(): ...
文中给出了一个修正后的日志装饰器例子,它可以处理被装饰函数带有任意参数的情况。 此外,还提到了如何创建带有参数的装饰器。此时,需要定义一个装饰器工厂函数,这个工厂函数返回一个装饰器,该装饰器可以接收...
接下来通过一个简单的例子来展示如何使用装饰器来记录函数的执行时间。 **2.1 示例代码** ```python import time # 定义一个装饰器函数,用于计算并打印函数执行的时间 def timer(func): def wrapper(*args, **...
Python装饰器是一种高级编程技巧,它允许我们修改或增强函数、方法或类的行为,而无需对原始代码进行任何更改。装饰器本质上是一个接收一个函数作为输入并返回一个新的函数的函数。这种设计模式在Python中非常常见,...
Python中的装饰器是一种高级函数,它是Python语言的特色特性,用于修改或增强其他函数的功能,而无需改动原函数的代码。装饰器本质上是函数,它能够接收一个函数作为参数,并返回一个新的函数。在Python中,装饰器的...
函数装饰器是Python语言中的一项重要特性,它允许用户在不修改函数本身定义的情况下,增加函数的功能。而带参数的函数装饰器,顾名思义,就是在装饰器中可以传入参数,使得装饰器本身也具备了更高的灵活性和功能扩展...
Python中的装饰器是一种强大的工具,它允许我们修改或增强函数、类或其他可调用对象的行为,而无需直接改动它们的源代码。装饰器基于闭包的概念,因此理解闭包是学习装饰器的关键。 闭包是一种特殊的函数,它定义在...
装饰器是Python中一个强大的设计模式,它允许用户在不改变原有函数定义的情况下,增加额外的功能。本篇文章将深入剖析Python装饰器的引入、作用、定义方法、以及如何应用装饰器进行实际编程。 首先,装饰器是面向...
对于类装饰器,它们的工作方式与函数装饰器相似,但接收的是类而不是函数。类装饰器通常需要实现 `__call__` 方法,这样当类实例被调用时,就可以执行相应的逻辑。例如: ```python class ClassDecorator: def __...
Python函数装饰器是一种强大的工具,它允许我们修改或增强函数的行为,而不改变其原始代码。装饰器本质上是一个接收函数作为参数并返回新函数的函数。它们在Python中广泛用于实现如日志记录、性能测试、权限控制等...
写了2个装饰器日志的例子, 第一个是不带参数的装饰器用法示例,功能相当于给函数包了层异常处理,第二个是带参数的装饰器用法示例,将日志输出到文件。 ``` #coding=utf8 import traceback import logging from ...
在这个例子中,`error_handler`装饰器为`f1`函数添加了异常处理功能,如果`f1`执行过程中抛出异常,装饰器会捕获并打印错误信息,而无需在`f1`函数内部写异常处理代码。 通过深入理解装饰器,我们可以更有效地组织...
在"Python函数学习.zip"这个压缩包中,可能包含了关于Python函数的各种学习资源,如教程、示例代码或者练习题。为了深入理解Python函数,我们需要探讨以下几个关键知识点: 1. **定义函数**: 在Python中,我们...
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。这种设计模式在Python中被广泛应用,特别是在处理日志、性能测试、事务处理、缓存等...