zoukankan      html  css  js  c++  java
  • day12 装饰器的模版

    1.什么是装饰器

      装饰器指的是为被装饰对象(别人)添加新功能的工具

      装饰器本身可以是任意可调用对象

      被装饰器对象也可以是任意可调用对象

    2.为何要用装饰器

      开放封闭原则:指的是对修改封闭,对扩展开放

      装饰器的实现原则:

      1.不能修改被装饰对象的源代码

      2.不能修改被装饰对象的调用方式

      装饰器的目的

      就是在遵循原则1和2的前提下为被装饰对象添加新功能

    如何用

    import time

    def index():

      time.sleep(1)

      print('index page')

    def calc(func): 

      def wrapper():

        start = time.time()

        func()

        stop = time.time()

        print('用时:',stop - start)

      return wrapper

    index = calc(index)  #把wrapper这个函数名返回给

    index()

    以上calc就是一个装饰器,用来给index增加新功能

    但是这还不够,如果原函数有返回值,或者有有参数传进来,就会有问题,

    所以wrapper的形式要尽量做到像原函数

    装饰器的基本模版

    def new_func(func)

      def wrapper(*args,**kwargs):#把wrapper定义成可以接受任何格式参数

        #新增功能的代码

        res = func(*args,**kwargs) #把用户调用新函数wrapper带来的参数原封不动给到func,就和调用原函数一样,并拿到函数的返回值

        return res #如果原函数有返回值,那新函数也有返回值

      return wrapper #把添加好新功能的函数名返回,方便下次偷梁换柱的调用

    @new_func #这是装饰器的语法糖,写在要装饰对象的正上方定格写,相当于把接下来的函数名当作参数传给new_func,在赋值给函数名 login = new_func(login)

    def login():

      print(‘login’)

      

  • 相关阅读:
    poj 2187 Beauty Contest(旋转卡壳)
    poj 2540 Hotter Colder(极角计算半平面交)
    poj 1279 Art Gallery(利用极角计算半平面交)
    poj 3384 Feng Shui(半平面交的联机算法)
    poj 1151 Atlantis(矩形面积并)
    zoj 1659 Mobile Phone Coverage(矩形面积并)
    uva 10213 How Many Pieces of Land (欧拉公式计算多面体)
    uva 190 Circle Through Three Points(三点求外心)
    zoj 1280 Intersecting Lines(两直线交点)
    poj 1041 John's trip(欧拉回路)
  • 原文地址:https://www.cnblogs.com/shanau2/p/10038453.html
Copyright © 2011-2022 走看看