python基础-装饰器

python理解装饰器

一、装饰器是干嘛用的?

  • 装饰嘛,就像人化妆一样。在不影响人体功能的前提下,点缀点缀,让你仿佛换个人。

  • 在这里插入图片描述

  • 差不多就是这区别。

二、python中如何实现?

  • 使用 @xxx 的方法来实现。

    @xxx 其实会做两件事:

    1. 执行xxx函数。
    2. xxx函数的返回值,是一个函数对象,会替换掉要装饰的函数。
  • 比如这段代码:

    def print_a(func):
        print("A");
        return func;
    
    @print_a
    def print_x():
        print("X");
    
    print("<------------------>");
    print_x();
    
  • 这一段代码做了什么事情?

    • 1:

      def print_a(func):
          print("A");
          return func;
      

      就是定义了一个print_a 函数,传一个参数。

    • 2:

      @print_a
      def print_x():
          print("X");
      

      定义了一个名叫print_x()的函数。尝试使用print_a进行装饰。

      @print_a 做了什么呢?

      它先把print_a函数执行一下。然后print_a函数返回了一个 函数对象。重点:print_a返回的函数对象,会代替真正的print_x(); 当你调用print_x的时候,其实调用的是print_a返回的函数对象

    • 3:

      使用@print_a这种写法,默认print_a会被传一个参数,参数是print_x的函数对象。

    • 4:

      执行结果是:

      /*一开始就先执行了@print_a的函数*/
      A
      /*然后执行了分隔符打印*/
      <------------------>
      /*最后这里执行print_x()函数。这里注意,print_x函数其实是print_a返回的函数对象*/
      X
      
      请按任意键继续. . .
      

三、一个简单的装饰器

  • 了解了@print_a是怎么工作的。现在看一个简单的装饰器。

    def print_world(func):
    	print("world is %s" %func);
    	
    def print_hello(func):
    	print(func);
    	return print_world;
    
    	
    @print_hello
    def print_string(str):
    	print("传入的参数是:%s" %str);
    	
    print_string('123');
    

    分析:

    这里的@print_hello,print_hello函数会返回一个print_world 的函数对象,然后替换掉print_string,所以,当你调用print_string的时候,其实执行的是print_world.

    所以print_string函数被装饰成了print_world。

    运行结果:

    在这里插入图片描述

    可以看到,虽然我调用的是print_string(‘123’);但其实调用的是print_world。

  • 上面的写法是不好的,因为print_world完全和print_string没有关系。已经是换人了,不是化妆了。

    所以换一个写法:

    def print_hello(func):
    	def wrapper(*args, **kwargs):
    		print('Hello');
    		return func(*args, **kwargs);
    	return wrapper;
    
    	
    @print_hello
    def print_string(str):
    	print("传入的参数是:%s" %str);
    
    
    print_string('123');
    

    使用这种写法,就是把print_string函数换成wrapper函数了。wrapper函数先执行了一个print(‘hello’),然后执行func.也就是print_string本来的功能。

    这就仿佛是在print_string 函数 每次执行之前,先执行一下其它的东西,也就是print_string被装饰了。

    运行结果如下:

    在这里插入图片描述

    你去打印一下print_string的名字,发现它的名字都叫wrapper了,也就是现在print_string已经不是它自己了。

    如果要保留print_string自己的名字信息,怎么做呢?

    这样写:

    from functools import wraps
    
    def print_world(func):
    	print("world is %s" %func);
    	
    def print_hello(func):
    	@wraps(func)
    	def wrapper(*args, **kwargs):
    		print('Hello');
    		return func(*args, **kwargs);
    	return wrapper;
    
    	
    @print_hello
    def print_string(str):
    	print("传入的参数是:%s" %str);
    
    
    print(print_string.__name__);
    

    运行结果:

    在这里插入图片描述

    使用这个wraps工具,在print_hello替换函数之前用@wraps(func)再装饰一下,动动脚指头想想,都知道这个是改函数信息的。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值