博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python装饰器进阶
阅读量:7153 次
发布时间:2019-06-29

本文共 3547 字,大约阅读时间需要 11 分钟。

  hot3.png

对带参数的函数进行装饰

'''对带参数的函数进行装饰,内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象''' def deco(func):    def _deco(a, b):        print("before myfunc() called.")        ret = func(a, b)        print("  after myfunc() called. result: %s" % ret)        return ret    return _deco @decodef myfunc(a, b):    print(" myfunc(%s,%s) called." % (a, b))    return a + b myfunc(1, 2)myfunc(3, 4)

对参数数量不确定的函数进行装饰

'''对参数数量不确定的函数进行装饰,参数用(*args, **kwargs),自动适应变参和命名参数''' def deco(func):    def _deco(*args, **kwargs):        print("before %s called." % func.__name__)        ret = func(*args, **kwargs)        print("  after %s called. result: %s" % (func.__name__, ret))        return ret    return _deco @decodef myfunc(a, b):    print(" myfunc(%s,%s) called." % (a, b))    return a+b @decodef myfunc2(a, b, c):    print(" myfunc2(%s,%s,%s) called." % (a, b, c))    return a+b+c myfunc(1, 2)myfunc(3, 4)myfunc2(1, 2, 3)myfunc2(3, 4, 5)

让装饰器带参数

'''让装饰器带参数,相比在外层多了一层包装。装饰函数名实际上应更有意义些''' def deco(arg):    def _deco(func):        def __deco():            print("before %s called [%s]." % (func.__name__, arg))            func()            print("  after %s called [%s]." % (func.__name__, arg))        return __deco    return _deco @deco("mymodule")def myfunc():    print(" myfunc() called.") @deco("module2")def myfunc2():    print(" myfunc2() called.") myfunc()myfunc2()

让装饰器带 类 参数

'''装饰器带类参数''' 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()

装饰器带类参数,并分拆公共类到其他py文件中,同时演示了对一个函数应用多个装饰器

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
'''装饰器带类参数,并分拆公共类到其他py文件中同时演示了对一个函数应用多个装饰器''' from mylocker import * 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. Python装饰器学习 http://blog.csdn.net/thy38/article/details/4471421

2. Python装饰器与面向切面编程 http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html
3. Python装饰器的理解 http://apps.hi.baidu.com/share/detail/17572338

转载于:https://my.oschina.net/yehun/blog/870907

你可能感兴趣的文章
Vue 源码剖析 —— 数组变化侦测
查看>>
6月14日奋战es5基础-1
查看>>
Socket IO与NIO(六)
查看>>
一图胜千言,8张图理解Java
查看>>
[算法]动态规划之最长递增子序列
查看>>
好程序员告诉你Java架构师学习路线
查看>>
Redis之主从集群环境搭建
查看>>
tab切换小例子
查看>>
Java封装
查看>>
【快学springboot】9.使用 @Transactional 注解配置事务管理
查看>>
匿名对象方案与实体对象方案对比
查看>>
NTP服务放大攻击的解决办法
查看>>
SonarQube代码质量管理工具的安装(Linux)
查看>>
Niginx +Tomcat 集群搭建
查看>>
atoi 实现
查看>>
机器学习中的度量——相关系数
查看>>
poj 3237 Tree
查看>>
SQL SERVER 占用资源高的SQL语句
查看>>
telnet不是内部命令也不是外部命令
查看>>
22. Angular 中用 a 标签 href 路由时在浏览器中显示异常 "%2F" 路由失败问题
查看>>