首页 > 其他分享 >装饰器

装饰器

时间:2023-01-19 22:33:34浏览次数:31  
标签:index outer func time print 装饰 def

目录

装饰器简介

无参装饰器

有参装饰器

装饰器模板

装饰器语法糖

装饰器简介

1.概念
	在不改变被装饰对象原代码和调用方式的情况下给被装饰的对象添加新的功能
2.本质
	并不是一门新技术 而是由函数参数、名称空间、函数名多种用法、闭包函数组合到一起的结果
3.口诀
	对修改封闭 对扩展开放
4.储备知识
	时间相关操作
    	import time
        print(time.time())  # 时间戳(距离1970-01-01 00:00:00所经历的秒数)
		time.sleep(3)
		print('睡醒了 干饭')

		import time
         count = 0
         start_time = time.time()
         while count < 100:
             print('哈哈哈')
             count += 1
         end_time = time.time()
         print('循环消耗的时间', end_time - start_time)

装饰器推导流程

import time

def index():
    time.sleep(3)
    print('from index')
def home():
    time.sleep(1)
    print('from home')
'''1.直接在调用index函数的前后添加代码'''
start_time = time.time()
index()
end_time = time.time()
print('函数index的执行时间为>>>:',end_time-strat_time)
'''2.index调用的地方较多 代码不可能反复拷贝>>>:相同的代码需要在不同的位置反复执行>>>:函数'''
def get_time():
    strat_time = time.time()
    index()
    end_time = time.time()
    print('函数index的执行时间为>>>:',end_time-start_time)
get_time()
'''3.函数体代码写死了 只能统计index的执行时间 如何才能做到统计更多的函数运行时间 直接传参变换统计的函数'''
def get_time(xxx):
    start_time = time.time()
    xxx()
    end_time = time.time()
    print('函数的执行时间为>>>:', end_time-start_time)
get_time(index)    
get_time(home)
'''4.虽然实现了一定的兼容性 但是并不符合装饰器的特征  第一种传参不写 只能考虑闭包'''
def outer(xxx):
    # xxx = index
    def get_time():
        strat_time = time.time
        xxx()
        end_time = time.time
        print('函数的执行时间为>>>:', end_time-start_time)
    return get_time
res = outer(index)
res()
res1 = outer(home)
res1()
'''5.调用方式还是不对 如何变形>>>:变量名赋值绑定 (******)'''
def outer(xxx):
    def get_time:
        start_time = time.time()
        xxx()
        end_time = time.time()
        print('函数的执行时间为>>>:', end_time-start_time)
    return get_time
index = outer(index)
home = outer(home)
index()
home()
'''6.上述装饰器只能装饰无参函数 兼容性太差'''
def func(a):
	time.sleep(0.1)
    print('form func',a)
    
def func1(a,b):
	time.sleep(0.2)
    print('form func1',a,b)
    
def func2():
	time.sleep(0.3)
    print('form func2')

def outer(xxx):
    def get_time(a,b):
        start_time = time.time()
        xxx(a,b)
        end_time = time.time()
        print('函数的执行时间为>>>:',end_time-start_time)
     return get_time   
func1 = outer(func1)
func1(1, 2)
func = outer(func)
func(1)
func2 = outer(func2)
func2()
'''7.被装饰的函数不知道有没有参数以及有几个参数 如何兼容'''
def func(a):
    time.sleep(0.1)
    print('from func', a)
def func1(a,b):
	time.sleep(0.2)
    print('from func', a, b)
def outer(xxx):
    def get_time(*args, **kwargs):
        start_time = time.time()
        xxx(*args, **kwargs)
        end_time = time.time()
        print('函数的执行时间>>>:', end_time-start_time)
	return get_time
fucn = outer(func)
func(123)
func = outer(func1)
func1(1, 2)
'''8.如果被装饰的函数有返回值'''
import time
def func(a):
    time.sleep(0.1)
    print('from func', a)
    return 'func'
def func1(a,b):
    time.sleep(0.2)
    print('from func1', a, b)
    return 'func1'
def outer(xxx):
    def get_time(*args, **kwargs):
        start_time = time.time()
        res = xxx(*args, **kwargs)
        end_time = time.time()
        print('函数的执行时间>>>:', end_time-start_time)
        return res
    return get_time
func = outer(func)
res = func(123)
print(res)

装饰器模板

# 务必掌握
def outer(func):
    def inner(*gras, **kwgras):
        # 执行被装饰对象之前可以做的额外操作
        res = func(*gras, **kwgras)
        # 执行被装饰对象之后可以做的额外操作
        return res
    return inner

装饰器语法糖

def outer(func_name):
    def inner(*args, **kwargs):
        print('执行被装饰对象之前可以做的额外操作')
        res = func(*args, **kwargs)
        print('执行被装饰对象之后可以做的额外操作')
        return res
    return inner
"""
语法糖会自动将下面紧挨着的函数名当做第一个参数自动传给@函数调用
"""
@outer  # func = outer(func)
def func():
    print('from func')
    return 'func'

@outer  # index = outer(index)
def index():
    print('from index')
    return 'index'

func()
index()

标签:index,outer,func,time,print,装饰,def
From: https://www.cnblogs.com/DragonY/p/17062241.html

相关文章

  • 小满nestjs(第二十二章 nestjs 自定义装饰器)
    在Nestjs中我们使用了大量装饰器decorator,所以Nestjs也允许我们去自定义装饰器。 案例1自定义权限装饰器生成装饰器 nestgd[name]import{SetMetadata}from'@......
  • 小满nestjs(第四章 前置知识装饰器-实现一个GET请求)
    安装依赖npminstallaxios-S定义控制器 ControllerclassController{constructor(){}getList(){}}定义装饰器这时候需要使用装饰器工厂应为装饰器......
  • 小满nestjs(第三章 前置知识装饰器)
    1、什么是装饰器装饰器是一种特殊的类型声明,他可以附加在类,方法,属性,参数上面装饰器写法tips(需要开启一项配置)类装饰器主要是通过@符号添加装饰器他会自动把class的构造函......
  • Python闭包和装饰器的学习
    之前看了不少的帖子,总是看了这篇帖子说的理解了,换篇帖子说的又不理解了,把人弄晕了,究其原因还是因为没有把底层原理理解。这两个概念总是放在一起说,两者之间肯定是有关系的......
  • 情人节装饰品心形灯串上架美国亚马逊UL588流程
    2月14日,是西方传统的圣瓦伦丁节,又称“情人节”,它具有悠久的历史。古罗马时代的牧神节,就是一个情侣们的节日。是日男女青年欢聚一堂,姑娘们把表达爱情的祝词放在签筒里,小伙子......
  • 学习记录-装饰器模式
    装饰器模式装饰器模式(DecoratorPattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式......
  • 鸿蒙ArkTS之装饰器(一)
    以下内容基于HarmonyOS3.1DeveloperPreview(API9)版本,虚拟机测试可以兼容API8参考:鸿蒙开发者官网的文档ArkTS采用装饰器标注对象的功能。基础UI组件结构每个UI组件需......
  • Python中高阶函数与装饰器教程
    1高阶函数1.1数学概念回顾下数学知识:y=f(x)这是最开始接触的普通函数y=g(f(x))这个就是我们接触到的高阶函数在数学和计算机科学中,高阶函数至少应当是满足下面一......
  • python装饰器
    python装饰器--开放封闭原则知识点回顾#*args**kwargsdefwrapper(*args,**kwargs):#接受(形参)args=(1,2,3)kwargs={'a':1,'b':2}index(*args,**kwargs) #......
  • 09.(结构型模式)java设计模式之装饰器模式
    一、什么是装饰器模式简介:也叫包装设计模式,属于结构型模式,它是作为现有的类的一个包装,允许向一个现有的对象添加新的功能,同时又不改变其结构。给对象增加功能,一般两种......