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)

大家都在看

  • VMware ESXi 7.0 Update 3c SLIC 2.6 & Unlocker (2022 U3 Refresh)

    提供标准版和 Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科) 定制版镜像 请访问原文链接:VMware ESXi 7.0…

    Linux 2023年5月27日
    097
  • redis的三种集群方式

    redis有三种集群方式:主从复制,哨兵模式和集群。 1.主从复制 主从复制原理: 从服务器连接主服务器,发送SYNC命令; 主服务器接收到SYNC命名后,开始执行BGSAVE命令…

    Linux 2023年5月28日
    089
  • 记一次从源码泄露到getshell(一)

    0x00 前言 此次渗透中的所有修改已经复原,且漏洞已经提交至cnvd平台 0x01 源码泄露 在一个月黑风高的夜晚,闲来无事的我又开着脚本利用hunter进行互联网站点源码的扫描…

    Linux 2023年5月28日
    0117
  • 软件科学概论复习

    软件的内在特性 系统的三种类型 S系统:有规范定义,可从规范派生 P系统:需求基于问题的近似解,但现实世界保持稳定 什么是设计模式 基于面向对象设计原则总结出的经验模型。 按照模块…

    Linux 2023年6月8日
    0111
  • 1.VMware安装CentOS

    注:以下内容适用于Windows操作系统。 一.安装VMware 带秘钥的VMware Workstation 14 Pro下载地址为: 链&#x63…

    Linux 2023年5月27日
    0151
  • vi/vim编辑器tar 命令

    一开始进入的模式 此模式下,可使用方向键(上、下、左、右键)或 k、j、h、i 移动光标的位置 操作类型 操作键 功能 翻页 Pagedown Pageup 向下翻页 向上翻页 行…

    Linux 2023年6月6日
    079
  • python虚拟环境介绍与安装(不借助anaconda)

    1 虚拟环境介绍 (1) 虚拟环境能对不同的状况进行环境隔离,程序A的环境变动不会影响程序B的开发 (2)比较便携,因为虚拟环境中都有各自的python包,U盘复制环境,省去其他人…

    Linux 2023年6月7日
    0113
  • SpringBoot-JDBC

    SpringBoot-JDBC 8.1 SpringData简介 对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都…

    Linux 2023年6月14日
    0102
  • phpcms搜索给分页代码添加参数方法

    在使用PHPCMS开发网站时遇到了一个搜索功能,需要在搜索结果分页链接上添加一些传递的参数,不然不能够正确翻页。 方法: 找到\phpcms\libs\functions\glob…

    Linux 2023年6月13日
    0109
  • JDK/MYSQL/TOMCAT环境变量

    IDE:智能开发环境 SDK:软件开发工具包 JDK:Java开发工具包 JRE:Java运行环境 JAR:Java档案文件 API:应用程序接口 1.JAVA_HOME的变量名下…

    Linux 2023年6月7日
    073
  • Python 练习题:用索引取出LIST中的值

    请用索引取出下面list的指定元素,分别为Apple,Python,Lisa -*- coding: utf-8 -*- 请用索引取出下面list的指定元素 L = [ [‘App…

    Linux 2023年6月8日
    0103
  • redis限流的3种实现方式

    Redis限流的实现方式有3种,分别是:1、基于Redis的setnx的操作,给指定的key设置了过期实践;2、基于Redis的数据结构zset,将请求打造成一个zset数组;3、…

    Linux 2023年5月28日
    0101
  • 大数据之Hadoop中HDFS的故障排除

    NameNode故障处理 1)需求 NameNode进程挂了并且存储的数据也丢失了 2)故障模拟 (1) kill -9 NameNode进程 kill -9 19886 (2)删…

    Linux 2023年6月8日
    0115
  • 每天一个 HTTP 状态码 前言

    HTTP 状态码由 3 位阿拉伯数字构成,其中第一位用于定义 HTTP 响应的类型… 前前言 在重新开始写博文(其实大多也就最多算是日常笔记小结)之际,就想着从短小精悍…

    Linux 2023年6月7日
    094
  • Linux i3 用户手册(简要)

    i3 用户手册 与(mod一起使用的键 一般为Win键或为Alt键, 可以和与 Shift+\)mod 一起使用 按键参考图 红色键是您需要按下的修饰符(默认情况下),蓝色键是您的…

    Linux 2023年6月7日
    094
  • Xftp 远程工具的使用与jdk 安装(Linux最小安装版)

    Xftp 的安装使用 下载链接:Xftp7 – Dominic 的蓝奏云分享 安装和注册步骤可参考 Xshell:Linux 最小安装与 Xshell 远程工具的使用 …

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