首页 > 编程语言 >【python】多层级装饰器与类装饰器

【python】多层级装饰器与类装饰器

时间:2022-10-29 15:47:41浏览次数:43  
标签:__ 层级 python makebold wrapper time print 装饰 def

  • 当一个功能函数,我们添加了多个额外功能时,这是我们就要使用多层装饰器;多层装饰器使用时是按就就近原则
def makebold(fn):
    print('加载makebold')
    def wrapper():
        print('执行makebold中wrapper函数')
        return "<b>" + fn() + "</b>"
    return wrapper

def makeitalic(fn):
    print('加载makeitalic')
    def wrapper():
        print('执行makeitalic中wrapper函数')
        return "<i>" + fn() + "</i>"
    return wrapper

@makebold        #hello = makebold(wrapper)
@makeitalic      #wrapper = makeitalic(hello)
def hello():
    return "hello alvin"

print(hello())

执行结果
加载makeitalic
加载makebold
执行makebold中wrapper函数
执行makeitalic中wrapper函数
<b><i>hello alvin</i></b>
  • 再来看看类装饰器,相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。使用类装饰器还可以依靠类内部的__call__方法,当使用 @ 形式将装饰器附加到函数上时,就会调用此方法。
import time

class Foo(object):
    def __init__(self, func):
        self._func = func

    def __call__(self):
        start_time=time.time()
        self._func()
        end_time=time.time()
        print('spend %s'%(end_time-start_time))

@Foo  #bar=Foo(bar)
def bar():
    print ('bar')
    time.sleep(2)

bar()    #bar=Foo(bar)()>>>>>>>没有嵌套关系了,直接active Foo的 __call__方法

标签:__,层级,python,makebold,wrapper,time,print,装饰,def
From: https://www.cnblogs.com/xwltest/p/16838842.html

相关文章

  • python Tips -----主函数
    if__name__=="__main__":python和C++/Java不一样,没有主函数一说,也就是说python语句执行不是从所谓的主函数main开始的。当运行单个python文件时,如运行a.py,这个时候a......
  • 上手python之字典
    为什么使用字典通过【字】 就能找到对应的【含义】 所以,我们可以认为,生活中的字典就是记录的一堆:【字】:【含义】【字】:【含义】......Python中字典和生活中字典十分相......
  • 上手Python之set(集合)
    为什么使用集合我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景。为何又需要学习新的集合类型呢?通过特性来分析:列表可修改、支持重复元素且......
  • 上手python之序列
    序列概念序列是指:内容连续、有序,可使用下标索引的一类数据容器列表、元组、字符串,均可以可以视为序列。如图,序列的典型特征就是:有序并可用下标索引,字符串、元组、列表均满足......
  • 上手Python之str(字符串)
    再识字符串尽管字符串看起来并不像:列表、元组那样,一看就是存放了许多数据的容器。但不可否认的是,字符串同样也是数据容器的一员。字符串是字符的容器,一个字符串可以存放任......
  • 上手Python之列表
    数据容器为什么学习数据容器思考一个问题:如果我想要在程序中,记录5名学生的信息,如姓名。如何做呢?学习数据容器,就是为了批量存储或批量使用多份数据 Python中的数据容器:一种......
  • 上手Python之函数
    函数函数:是组织好的,可重复使用的,用来实现特定功能的代码段。为什么随时都可以使用len()统计长度? 因为,len()是Python内置的函数:是提前写好的可以重复使用实现统计长度这......
  • 上手Python之元组
    为什么需要元组思考:列表是可以修改的。如果想要传递的信息,不被篡改,列表就不合适了。元组同列表一样,都是可以封装多个、不同类型的元素在内。但最大的不同点在于:元组一旦定......
  • 上手python之while循环和for循环
    while循环语句 只要条件满足会无限循环执行 小美心软,只要表白100次,就会成功print("小美,我喜欢你")print("小美,我喜欢你")print("小美,我喜欢你")...(还有97次)... 使用循......
  • 上手python之运算符和字符串格式化
    运算符算术(数学)运算符运算符描述实例+加两个对象相加 a + b 输出结果 30-减得到负数或是一个数减去另一个数 a - b 输出结果 -10*乘两个数相乘或是返回一个被重复......