python中的反射

python反射简介

所谓反射是指通过字符串的方式获取对象,然后执行对象的属性或方法。在python中一切皆对象,因此我们可以对一切事物进行发射。

关于反射python为我们提供了四个方法:

hasattr(object, name):name必须是字符串,如果字符串name是object对象当中的某一属性或某一方法将返回True,否则返回False。

getattr(object, name ,default=None):name必须是字符串,如果字符串name是object对象当中的某一属性或某一方法将返回对应的属性或方法,否则如果给定默认值将返回默认值,如果没指定默认值将引发AttributeError的异常。

setattr(object, name, value):可以新增或修改对象的属性,name必须是字符串,value可以是任意数据类型。如果name是object的属性将修改对应属性的值为value,如果对象不是object的属性将新增一个属性。

delattr(object, name):删除对象属性,name必须是字符串,name必须是object的属性且object对这个属性有删除的权限,否则将引发AttributeError。

下面以对对象进行反射,对类进行反射,对当前模块进行反射,对其它模块进行反射为示例来了解反射的应用。

关于getattr(object, name ,default=None)中的参数default需要注意,直接按位置参数传参即可,不要是要关键字参数进行传参,否则会报错。

看了上面的代码片段,也许你会感觉反射也不过如此,但是在有些场景反射真的很有用,下面以FTP server和FTP client为例,我之前写的小练习。

下面在不使用反射的情况下解析客户端发来的命令(伪代码):

上面的情况很明显的就是程序有多少功能,就需要有多少个if来对其进行判断,当某个方法发生改变或新增功能时,需要到if中添加相应的逻辑判断或者修改对应的逻辑,无论是从代码的阅读还是后期的维护都不是很方便。

下面使用反射的情况下解析客户端发来的命令:

使用反射对客户端命令解析,无论程序有多少方法,都只需上面那几行代码即可。相比通过if对命令解析反射结构更加清晰,当某个方法发生改变,或添加新的功能,只需要把所有精力都用在功能实现上即可,不需要像if那样新增逻辑或者修改对应的逻辑,易于维护。到此反射就简单介绍到这里。

Original: https://www.cnblogs.com/caesar-id/p/12864876.html
Author: id_iot
Title: python中的反射

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582600/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 搭建ES集群

    添加以下elasticsearch用户: bash;gutter:true; 1 useradd elasticsearch 2 passwd elasticsearch</…

    Linux 2023年6月8日
    077
  • 数据库_存储过程简介(oracle版)

    应朋友要求,写个存储过程说明,本篇比较简单,适合新接触存储过程的同学 先来个简单的 begin dbms_output.put_line(‘my first execute’); …

    Linux 2023年6月6日
    084
  • web框架底层原理;django介绍

    目录 纯手撸web框架 基于wsgiref模块 优化处理 动静态网页 基于jinja2模板语法 框架请求流程 python主流web框架 *django框架介绍 内容 纯手撸web…

    Linux 2023年6月7日
    078
  • 013 Linux 搞懂「文件所属者更改及权限的赋予」从未如此简单(chmod、chgrp、chown)

    01 一图详解「ls -l」 02 两种符号区分表示文件和目录 03 三种访问权限及表示 04 四种符号表示文件所属者用户 05 三个变更文件所属者及修改所属者权限的命令 06 工…

    Linux 2023年5月27日
    089
  • Linux 配置Git

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 一、用git –version命令检查是否已经安装 二、下载git源码并解压 wget https:/…

    Linux 2023年5月27日
    0126
  • 部署solr服务

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 一、S orl单机部署 准备:solr5.5、tomcat8.5、jdk1.8 2.复制./solr-5.5.0/s…

    Linux 2023年6月14日
    0107
  • shell脚本调试方法

    set -x bash -x test.sh 作者:习惯沉淀 如果文中有误或对本文有不同的见解,欢迎在评论区留言。 如果觉得文章对你有帮助,请点击文章右下角【推荐】一下。您的鼓励是…

    Linux 2023年5月28日
    081
  • 爱前端公开课学习笔记——JS01 认识js 变量

    认识js 在谷歌浏览器的控制台中右键单击空白处,选择检查可以打开控制台 查看console.log输出的内容。 JS的注释 是”//”或者”/ …

    Linux 2023年6月14日
    092
  • kali linux安装后乱码的解决方法

    操作系统是5.3 解决方法是在终端执行命令: Original: https://www.cnblogs.com/wangpingcong/p/12641912.htmlAutho…

    Linux 2023年6月7日
    088
  • postgresql 自增列 初始值设置

    — 获取自增列的名称 SELECT pg_get_serial_sequence(‘table_name’, ‘id’) AS sequence_name; –获取自增列的下一…

    Linux 2023年6月14日
    060
  • MySQL安装卸载、idea中Database的使用、常用的sql语句

    MySQL安装卸载 MySQL安装 在下面的 &#x8D44;&#x6E90;&#x94FE;&#x63A5;中下载MySQL软件 压缩包(绿色版)…

    Linux 2023年6月6日
    0115
  • centos7磁盘扩容

    1.先增加一块磁盘 2.查看虚拟机磁盘[root@book ~]# df -h 记住红框里的位置信息 3.查看当前磁盘分区表[root@book ~]# fdisk -l 4.输入…

    Linux 2023年6月8日
    088
  • Spring的循环依赖

    本文简要介绍了循环依赖以及Spring解决循环依赖的过程 循环依赖是指对象之间的循环依赖,即2个或以上的对象互相持有对方,最终形成闭环。这里的对象特指单例对象。 对象之间的循环依赖…

    Linux 2023年6月8日
    0134
  • python 练习题:将列表中的大写字母转换成小写

    将列表中的大写字母转换成小写如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,L1 = [‘Hello’, ‘World’, 18, ‘Apple’,…

    Linux 2023年6月8日
    0136
  • Nginx参数详解

    ​ 从配置文件到events之间的内容,主要会设置一些影响nginx服务器整体运行的配置命令。主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数…

    Linux 2023年6月11日
    090
  • Linux基础学习(四)

    自建yum仓库,分别为网络源和本地源 1.本地源 点击查看代码 root@ct7:~# yum install autofs root@ct7:~# systemctl enabl…

    Linux 2023年6月8日
    0117
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球