zoukankan      html  css  js  c++  java
  • python进阶之装饰器之6.装饰器为被包装函数增加参数,如何实现装饰器对类进行打补丁或者说对类的功能进行扩充

    6.1装饰器为被包装函数增加参数
    # 装饰器为被包装函数增加参数
    from functools import wraps

    def optional_debug(func):
    @wraps(func)
    #此方法不可以随意为被包装函数增加参数,需要使用关键字的方法进行
    def wrapper(*args, debug=False, **kwargs):
    if debug:
    print('Calling', func.__name__)
    return func(*args, **kwargs)
    return wrapper


    @optional_debug
    def spam(a,b,c):
    print(a,b,c)
    return "hello"

    print(spam(1,2,3))
    # 1 2 3
    # hello

    print(spam(1,2,3, debug=True))
    # Calling spam
    # 1 2 3
    # hello

    # 使用场所:对于重复的代码可以进行优化




    6.2实现装饰器对类进行打补丁或者说对类的功能进行扩充
    #
    装饰器对类进行打补丁或者说对类的功能进行扩充 def log_getattribute(cls): # Get the original implementation orig_getattribute = cls.__getattribute__ # Make a new definition def new_getattribute(self, name): print('getting:', name) return orig_getattribute(self, name) # Attach to the class and return cls.__getattribute__ = new_getattribute return cls # Example use @log_getattribute class A: def __init__(self,x): self.x = x def spam(self): pass a=A(42) print(a.x) # getting: x # 42 print(a.spam) # getting: spam # <bound method A.spam of <__main__.A object at 0x00000276526EEE80>> print(a.spam()) # getting: spam # None # 使用继承同样可以得到以上结果,然而 # 类装饰器方案就显得更加直观,并且它不会引 # 入新的继承体系。它的运行速度也更快一些, # 因为他并不依赖 super() 函数
    仙衣眠云碧岚袍,一襟潇洒,两袖飘飘。玉墨舒心春酝瓢,行也逍遥,坐也逍遥。
  • 相关阅读:
    CocoaPods
    第一篇 理论 1.7 精进-正念-正知,如理作意和觉察力
    构架稳定与可扩展的优惠券系统
    一个产品从0到1的过程
    实现实时定位
    征信比拼重点是数据和连接
    黑产
    爬虫有什么用
    爬虫应用
    甘蔗理论
  • 原文地址:https://www.cnblogs.com/max520liuhu/p/9350458.html
Copyright © 2011-2022 走看看