IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python基础-理解装饰器 -> 正文阅读

[Python知识库]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)再装饰一下,动动脚指头想想,都知道这个是改函数信息的。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 07:42:06  更:2021-07-28 07:42:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/24 17:45:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码