python中的装饰器

python中的装饰器

why:为什么需要装饰器

有时候需要在不更改原函数的代码前提下给函数增加新功能

what:装饰器是什么

装饰器本身是一个python函数,它可以在其他函数不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

装饰器就是一个返回函数的高阶函数

how:怎么写装饰器

装饰器分类
  • 简单装饰器
    def log(func):
        def warpper(*args, **kw):    # warpper的参数定义决定了warpper函数可以接受任意参数调用
            print 'call %s():' % func.__name__    # 首先打印日志
            return func(*args, **kw)    # 再调用原始函数
        return warpper
    
    @log
    def now():
        print'haha'
    
    print now()
    print now.__name__.   # warpper

    接受一个原函数作为参数,并返回一个新函数

    在返回新函数之前,可以做一些想做的事情

    把装饰器@dec放到函数func定义处的前面,相当于执行了func = dec(func)

  • 带参数的装饰器

    如果装饰器本身需要传入参数,则需要编写一个返回decorator的高阶函数,即三层嵌套

    def log(text):    # 最外层传入需要的参数
        def decorator(func):    # 第二层传入函数
            #@functools.wraps(func)
            def wrapper(*args, **kw):
                print '%s, %s(): ' % (text, func.__name__)
                return func(*args, **kw)
            return wrapper
        return decorator
    
    @log('execute')
    def now():
        print 'lala'
        
    print now()
    print now.__name__.   # 结果是warpper

    因为经过装饰器的函数的__name__等属性已经变成了wrapper的,这样会导致有些依赖函数签名的代码出错,所以需要把原始函数的属性复制到wrapper()函数中,这种操作由内置的functools.wraps完成

    具体只要在warpper()前面加上@functools.wraps(func)即可

  • 类装饰器

    只要有某个对象重载了__call__()方法,装饰器函数就可以接受这个callable对象作为参数,然后返回一个callable对象

    一般来说callable的都是函数,如果一个类重载了__call__()方法,那么这个类对象就有了被调用的行为

    类装饰器就是用__init__()接受一个函数,然后重载__call__()并返回一个函数

    优点:灵活度大、高内聚、封装性等

    class logging(object):
        def __init__(self, func):
            self.func = func
            
        def __call__(self, *args, **kw):
            print 'name: {func}'.format(func = self.func.__name__)
            return self.func(*args, **kw)
        __name__ = 'log'
    
    @logging
    def now():
        print 'enen'
        
    print now()
    print now.__name__  # log
  • 带参数的类装饰器

    __init__()接受参数并存起来,在__call__()中接受函数并返回函数

    class logging(object):
        def __init__(self, text):
            self.text = text
        
        def __call__(self, func):    # 接受函数
            @functools.wraps(func)    # 将now的属性复制给wrapper
            def wrapper(*args, **kw):
                print '{text}, {name}'.format(text = self.text, name = func.__name__)
                func(*args, **kw)
            return wrapper
        
    @logging(text='execute')
    def now():
        print 'enen'
        
    print now()
    print now.__name__    # now
  • 内置装饰器

@staticmethod

@classmethod

@property

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装饰器Python一种用于修改函数或类的行为的语法结构。它们允许在不修改原始代码的情况下,通过添加额外的功能来装饰函数或类。 装饰器实际上是一个函数,它接受一个函数作为输入,并返回一个新的函数作为输出。这个新的函数通常会在调用原始函数之前或之后执行一些额外的代码。 下面是一个简单的装饰器示例: ```python def decorator_function(original_function): def wrapper_function(): # 在调用原始函数之前执行额外的操作 print("Before the original function is called") # 调用原始函数 original_function() # 在调用原始函数之后执行额外的操作 print("After the original function is called") return wrapper_function @decorator_function def say_hello(): print("Hello!") # 调用经过装饰器修饰过的函数 say_hello() ``` 在上述示例,我们定义了一个名为`decorator_function`的装饰器函数。该装饰器接受一个名为`original_function`的函数作为参数,并返回一个新的函数`wrapper_function`。`wrapper_function`在调用原始函数之前和之后,分别打印了一些额外的信息。 通过在`say_hello`函数定义之前加上`@decorator_function`,我们将`say_hello`函数传递给了装饰器,并将装饰器返回的函数赋值给了`say_hello`。这样,当我们调用`say_hello`函数时,实际上是在调用经过装饰器修饰过的函数`wrapper_function`。 装饰器提供了一种灵活且可重复使用的方式来扩展函数的功能,比如添加日志记录、性能计时、输入验证等。在Python,还有一种更简洁的语法糖形式来使用装饰器,即使用`@`符号将装饰器应用到函数上,如上述示例的`@decorator_function`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值