python装饰器学习

python中的装饰器(decorator)一般采用语法糖的形式,是一种语法格式。比如:@classmethod,@staticmethod,@property,@xxx.setter,@wraps(),@func_name等都是python中的装饰器。

        装饰器,装饰的对象是函数或者类。各种装饰器的作用都是一样的:改变被装饰函数或者方法的功能,性质。

一,装饰器的官方定义

        装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。

简单使用:def 函数名(func):def 内部函数名():func() #执行函数 return 内部函数名

不带参数函数的装饰器(不推荐)

import time
def outter(func):
    def inner():
        print('内部方法开始执行')
        time_start = time.time()
        func()
        time_end = time.time()
        print("一共花费了{0}秒时间".format(t_end - t_start, ))
    return inner

@outter
def test1():
    time.sleep(5)
    print('执行sleep函数')

if __name__ == '__main__':
    test1()

上面一个实例是简单的装饰器,执行顺序是先执行func()上面的代码,再执行func()里面的代码,最后再执行func()下方的代码,但是我们经常会碰到内部函数传参的情况,上面这种方法就不适用了,这个时候我们可以适用*args和**kwargs做下兼容,如下:

带参函数的装饰器

import time
def outter(func):
    def inner(*args,**kwargs):
        print('内部方法开始执行')
        time_start = time.time()
        func()
        time_end = time.time()
        print("一共花费了{0}秒时间".format(t_end - t_start, ))
    return inner

@outter
def test1(count):
    time.sleep(count)
    print('执行sleep函数')

if __name__ == '__main__':
    test1(2)

装饰器带参数

import time

def repeat(nums):
    def how_much_time(func):
        def inner(*args,**kwargs):
            print('内部方法开始执行')
            t_start = time.time()
            for i in range(nums):
                func(*args,**kwargs)
            t_end = time.time()
            print("一共花费了{0}秒时间".format(t_end - t_start, ))
        return inner
    return how_much_time

@repeat(nums=2)
def sleep5(count):
    time.sleep(count)
    print('内部函数开始执行')

if __name__ == '__main__':

    sleep5(1)

       装饰器和类使用(注意inner函数一定要加上self,并且在返回func的地方也要加上self)

import time

def deco(func):
    def inner(self,*args,**kwargs):
        print('zhixing')
        return func(self)
    return inner

class A:

    @deco
    def hobby(self):
        print('111')

if __name__ == '__main__':

    A().hobby()

装饰类(注意:inner里面不用加self,并且返回的func后面需要加()

def deco(func):
    def inner(*args,**kwargs):
        print('zhixing')
        return func()
    return inner

@deco
class A:


    def hobby(self):
        print('111')

if __name__ == '__main__':

    A().hobby()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习Python装饰器可以通过以下步骤进行: 1. 了解装饰器的概念和作用:装饰器是一种用于修改函数或类行为的函数或类。它可以在不修改原始函数或类的情况下,通过添加额外的功能来扩展其功能。 2. 学习装饰器的语法:装饰器可以使用函数或类来实现。使用函数实现装饰器时,需要使用`@`符号将装饰器应用于目标函数。使用类实现装饰器时,需要在类中定义`__call__`方法,并将装饰器应用于目标函数。 3. 掌握装饰器的常见应用场景:装饰器可以用于添加日志记录、性能统计、权限验证、缓存等功能。了解这些应用场景可以帮助你更好地理解装饰器的实际用途。 4. 阅读相关文档和教程:有很多优秀的教程和文档可以帮助你深入学习Python装饰器。你可以阅读Python官方文档中关于装饰器的部分,也可以搜索一些优质的博客或教程来学习。 5. 实践编写装饰器:通过编写一些简单的装饰器来加深对装饰器的理解。可以从一些简单的装饰器开始,逐渐扩展到更复杂的装饰器。 以下是一个使用类中的方法作为装饰器的示例[^2]: ```python class Decorator: def __init__(self, func): self.func = func def __call__(self, *args, **kwargs): # 在函数执行前添加额外的功能 print("Before function execution") # 调用原始函数 result = self.func(*args, **kwargs) # 在函数执行后添加额外的功能 print("After function execution") return result @Decorator def target_function(): print("Inside target function") # 调用被装饰的函数 target_function() ``` 这个示例中,`Decorator`类定义了一个装饰器,它在被装饰的函数执行前后添加了额外的功能。通过将`@Decorator`应用于`target_function`,`target_function`就被`Decorator`装饰器修饰了。当调用`target_function`时,装饰器的功能会被触发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值