装饰器

作者: 测试探索 | 来源:发表于2022-11-20 13:42 被阅读0次

一、装饰器的语法:

@装饰器

开放封闭原则:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。

二、装饰器的作用:

在不更改原功能函数内部代码,并且不改变调用方法的情况下为原代码添加新的功能。

三、装饰器的原理:

@decorator 等同于 ===> work1 = decorator(work1)

四、普通装饰器

def decorator(func):
    def wrapper():
        print("---开机,打开软件--")
        func()
        print("---关机,底薪到手---")
    return wrapper

@decorator# 作用 @decorator 等同于 ===> work1 = decorator(work1)
def work1():
    print("----写代码---")
work1()

五、装饰有参数和返回值的餐宿

5-1:实现传参

import time

def count_time(func):
    def wrapper(a,b):
        strat_time = time.time()
        func(a,b)
        end_time = time.time()
        t_time = end_time - strat_time
        print('运行总时间:%s' % t_time)
    return wrapper

@count_time
def work(a,b):
    time.sleep(2)
    e = a + b
    return e
d = work(2,3)
print(d)
image.png

5-2:实现被装饰函数返回值

调用功能函数,接收功能函数返回的结果,装饰器执行完返回结果

def count_time(func):
    def wrapper(a,b):
        # 获取开始时的时间
        strat_time = time.time()
        result = func(a,b)
        end_time = time.time()
        t_time = end_time - strat_time
        print('运行总时间:%s' % t_time)
        return result
    return wrapper

@count_time
def work(a,b):
    time.sleep(2)
    e = a + b
    return e
d = work(2,3)
print(d)
image.png

六:装饰器装饰类

"""
闭包形式的装饰器装饰类:可以在类实例对象的时候,进行功能扩展
"""
"""
闭包形式的装饰器装饰类:可以在类实例对象的时候,进行功能扩展
"""
def decorator(item):
    def wrapper(*args,**kwargs):
        print("装饰器扩展代码1")
        result = item(*args,**kwargs)
        result.name = "木森"
        print("装饰器扩张代码2")
        return result
    return wrapper


@decorator #Mytest = decorator(Mytest)
class Mytest:
    a = 100

print("Mytest:",Mytest)
print()
print("asb",Mytest())
image.png

七:解决装饰器副作用--wraps函数

import time
from functools import wraps
def count_time(fun):
    @wraps(fun)
    def wrapper(*args,**kwargs):
        st = time.time()
        # 调用原功能函数,并使用result接受返回值
        result = fun(*args,**kwargs)
        et = time.time()
        print("函数执行时间:",fun.__name__)
        # 装饰器中的代码执行完后,将原功能函数的结构返回出去
        return result
    return wrapper


@count_time
def work(a,b):
    """work函数"""
    res = a+b
    time.sleep(2)
    return res

@count_time
def work2():
    """work2函数的文档注释"""
    for i in range(3):
        time.sleep(1)

@count_time
def work3(aa,bb,cc,d,e,f,r,y = 999):
    """work3函数的注释"""
    print(aa,bb,cc,d,e,f,r,y)

# print(work(1,2))
# print(work2())
# 装饰器装饰之后会产生的副作用,无法获取原功能函数的特殊属性
print(work.__name__,work.__doc__)
print(work2.__name__,work2.__doc__)
print(work3.__name__,work3.__doc__)
image.png

八:装饰器传参

def decorator(name):
    """最外层的参数,接受装饰器传进来的值"""
    def wrapper2(func):
        """第二层参数func,接收被装饰器的函数"""
        def wrapper3(*args,**kwargs):
            """第三层参数,接受被装饰的函数,被调用时传进来的参数"""
            print("装饰器扩展的功能代码1")
            res = func(*args,**kwargs)
            print("装饰器扩展的功能代码2")
            return res
        return wrapper3
    return wrapper2


@decorator("musen")
def work():
    return "66666666"
print(work())

相关文章

  • 装饰器

    """@装饰器- 普通装饰器- 带参数的装饰器- 通用装饰器- 装饰器装饰类- 内置装饰器- 缓存装饰器- 类实现...

  • typescript 五种装饰器

    装饰器类型 装饰器的类型有:类装饰器、访问器装饰器、属性装饰器、方法装饰器、参数装饰器,但是没有函数装饰器(fun...

  • python——装饰器详解

    一、装饰器概念 1、装饰器 装饰器:一种返回值也是一个函数的函数,即装饰器。 2、装饰器目的 装饰器的目的:装饰器...

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • 装饰器

    装饰器 decorator类装饰器 带参数的装饰器 举例(装饰器函数;装饰器类;有参与无参) https://fo...

  • TypeScript装饰器

    前言 装饰器分类 类装饰器 属性装饰器 方法装饰器 参数装饰器需要在tsconfig.json中启用experim...

  • python之装饰器模版

    装饰器的作用:装饰器即可以装饰函数也可以装饰类。装饰器的原理:函数也是对象 1.定义装饰器 2.使用装饰器假设de...

  • 装饰器实验

    装饰器实验 说明 ts内包含了四个装饰器,类装饰器、属性装饰器、函数装饰器、参数装饰器,本文中测试一下其的使用。 ...

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

网友评论

      本文标题:装饰器

      本文链接:https://www.haomeiwen.com/subject/dfprxdtx.html