python函数装饰器详解_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()

输出:

>>>

before myfunc called [__main__.locker].

locker.acquire() called.(这是静态方法)

myfunc() called.

locker.release() called.(不需要对象实例

>>>

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

输出:

before myfunc called.

mylocker.acquire() called.

myfunc() called.

mylocker.unlock() called.

before myfunc called.

mylocker.acquire() called.

myfunc() called.

mylocker.unlock() called.

None

before __deco called.

mylocker.acquire() called.

before myfunc2 called.

lockerex.acquire() called.

myfunc2() called.

lockerex.unlock() called.

mylocker.unlock() called.

3

before __deco called.

mylocker.acquire() called.

before myfunc2 called.

lockerex.acquire() called.

myfunc2() called.

lockerex.unlock() called.

mylocker.unlock() called.

7

希望本文所述对大家的Python程序设计有所帮助。

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

本站所有资源全部来源于网络,若本站发布的内容侵害到您的隐私或者利益,请联系我们删除!

合作方式

Copyright © 2004-2018 https://www.gxlcms.com/. All Rights Reserved.

豫ICP备19030742号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值