设为首页 收藏本站
查看: 607|回复: 0

[经验分享] python 函数装饰器例子

[复制链接]

尚未签到

发表于 2017-4-28 10:56:52 | 显示全部楼层 |阅读模式
#! 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))

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370326-1-1.html 上篇帖子: 细说python 编码(转) 下篇帖子: python shelve 本地数据存储
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表