zoukankan      html  css  js  c++  java
  • python之路——装饰器函数

    装饰器

    
    
    print(time.time()) 时间戳
    time.sleep(1) 停一秒
    装饰器的意义:对于用户来讲 你感知不到装饰器的存在 在一个函数的前后添加功能
    import time  #时间模块
    
    def func1(): 
        print('in func1')
    
    def timer(func):
        def inner():
            start = time.time() #time.time 时间戳
            func()
            print(time.time() - start)
        return inner
    
    func1 = timer(func1)
    func1()
    装饰器一简单版
    import time
    def timer(func):
        def inner():
            start = time.time()
            func()
            print(time.time() - start)
        return inner
    
    @timer   #==> func1 = timer(func1)   #@timer 语法糖
    def func1():
        print('in func1')
    
    
    func1()
    装饰器-语法糖

      装饰器的本质:一个闭包函数

      装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

    def timer(func): #func 参数
        def inner(a):
            start = time.time()
            func(a)
            print(time.time() - start)
        return inner
    
    @timer
    def func1(a):
        print(a)
    
    func1(1)
    装饰器-带参数的装饰器

    其实装饰带参的函数并不是什么难事,但假如你有两个函数,需要传递的参数不一样呢?如下图:

    import time
    def timer(func):
        def inner(*args,**kwargs):
            start = time.time()
            re = func(*args,**kwargs)
            print(time.time() - start)
            return re
        return inner
    
    @timer   #==> func1 = timer(func1)
    def func1(a,b):
        print('in func1')
    
    @timer   #==> func2 = timer(func2)
    def func2(a):
        print('in func2 and get a:%s'%(a))
        return 'fun2 over'
    
    func1('aaaaaa','bbbbbb')
    print(func2('aaaaaa'))
    装饰器-成功hold住所有函数传参
    import time
    def timer(func):
        def inner(*args,**kwargs):
            start = time.time()
            re = func(*args,**kwargs)
            print(time.time() - start)
            return re
        return inner
    
    @timer   #==> func2 = timer(func2)
    def func2(a):
        print('in func2 and get a:%s'%(a))
        return 'fun2 over'
    
    func2('aaaaaa','bbbbbb')
    print(func2('aaaaaa'))
    装饰器-带返回值的装饰器

    开放封闭原则:

    1开放 对扩展是开放的 

    2封闭 对修改是封闭的

     装饰器的主要功能和装饰器的固定结构:

    装饰器的主要功能:

    在不改变函数调用方式的基础上在函数的前、后添加功能。

    装饰器的固定格式:

    def timer(func):
        def inner(*args,**kwargs):
            '''执行函数之前要做的'''
            re = func(*args,**kwargs)
            '''执行函数之后要做的'''
            return re
        return inner
    装饰器格式-需要牢记、背会
    def wrapper1(func):
        def inner():
            print('wrapper1 ,before func')
            func()
            print('wrapper1 ,after func')
        return inner
    
    def wrapper2(func):
        def inner():
            print('wrapper2 ,before func')
            func()
            print('wrapper2 ,after func')
        return inner
    
    @wrapper2
    @wrapper1
    def f():
        print('in f')
    
    f()
    多个装饰器 装饰一个函数
  • 相关阅读:
    为什么gitHub提交记录显示作者名称是unknow?
    hibernate的面向对象查询的效率有多低?
    Cesium中文网——如何开发一款地图下载工具[一]
    使用Cesium的地下渲染技术可视化瑞士的地质资源
    用Cesium可视化地下设施、矿山和地质层
    CesiumJS新增官方TypeScript类型定义
    Cesium1.70-介绍CesiumOSM建筑新特性
    宣布与Epic Games合作,为虚幻引擎创造Cesium
    地底,TypeScript和全球3D建筑发布于CesiumJS 1.70
    CesiumJS下载量超过1百万次
  • 原文地址:https://www.cnblogs.com/bsxq/p/7459974.html
Copyright © 2011-2022 走看看