知行编程网知行编程网  2022-12-05 14:30 知行编程网 隐藏边栏  7 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于最全python装饰器的各种写法的相关知识,希望可以帮到处于编程学习途中的小伙伴


装饰器是我们项目写作中最容易出现的内容。扎实的掌握这部分内容,对于我们的代码能否顺利的写出来是非常重要的。以下是关于


python装饰器问题,给大家最详细介绍。




装饰器的示例代码


# 定义装饰器
def decorator(func):
    def inner():
        # 在内部函数里面对已有函数进行装饰
        print('已添加登录认证')
        func()
 
    return inner
 
 
def comment():
    print('发表评论')
 
 
# 调用装饰器对已有函数进行装饰,左边的comment=inner
comment = decorator(comment)
 
# 调用方式不变
comment()




装饰器的语法糖写法




如果有多个函数需要添加登录验证功能,需要每次都写

func = decorator(func)这样代码对已有函数进行装饰,这种做法还是比较麻烦。

Python提供了一种更简单的装饰函数的编写方式,即语法糖。语法糖的书写格式为:@装饰器名称,也可以通过语法糖完成对已有函数的装饰。

# 定义装饰器
def decorator(func):
    def inner():
        # 在内部函数里面对已有函数进行装饰
        print('已添加登录认证')
        func()
 
    return inner
 
 
@decorator  # comment = decorator(comment) 装饰器语法糖对该代码进行了封装 左边comment=inner
def comment():
    print('发表评论')
 
 
# 调用方式不变
comment()




装饰器的执行时机


当前模块加载完成后,会立即执行装饰器,对已有函数进行装饰。

# 定义装饰器
def decorator(func):
    print('装饰器执行了')
 
    def inner():
        # 在内部函数里面对已有函数进行装饰
        print('已添加登录认证')
        func()
 
    return inner
 
 
@decorator  # comment = decorator(comment) 装饰器语法糖对该代码进行了封装 左边comment=inner
def comment():
print('发表评论')




运行结果



装饰器执行了

1




装饰器实现已有函数执行时间的统计


import time
 
 
def decorator(func):
    def inner():
        # 获取时间距离1970-1-1 0:0:1的时间差
        begin = time.time()
        func()
        end = time.time()
        result = end - begin
        print(f'函数执行完成耗时:{result}')
 
    return inner
 
 
@decorator
def work():
    for i in range(10000):
        print(i)
 
 
work()





装饰带有参数的函数



def decorator(func):
    def inner(num1, num2):
        print('正在努力执行加法计算')
        func(num1, num2)
 
    return inner
 
 
@decorator
def add_num(num1, num2):
    result = num1 + num2
    print(f'结果为:{result}')
 
 
add_num(1, 2)





装饰带有参数、返回值的函数



def decorator(func):
    def inner(num1, num2):
        print('正在努力执行加法计算')
        num = func(num1, num2)
        return num
 
    return inner
 
 
@decorator
def add_num(num1, num2):
    result = num1 + num2
    return result
 
 
result = add_num(1, 2)
print(f'结果为:{result}')




类装饰器的使用


class MyDecorator(object):
    def __init__(self, func):
        self.__func = func
 
    # 实现__call__方法,表示对象是一个可调用对象,可以像调用函数一样进行调用
    def __call__(self, *args, **kwargs):
        # 对已有函数进行封装
        print('马上就有下班啦')
        self.__func()
 
 
@MyDecorator  # @MyDecorator => show = MyDecorator(show)
def show():
    print('快要下雪啦')
 
 
# 执行show,就相当于执行MyDecorator类创建的实例对象,show() => 对象()
show()




扩展:






函数之所以能够调用,是因为函数内部实现了

__call__ 方法




以上就是关于装饰器的全部内容了,



如需了解更多

python实用知识,点击进入


本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享