Python自省及反射原理实例详解


Posted in Python onJuly 06, 2020

Python中的自省与反射

由于Python是一门强类型的动态解释型语言,故我们在某些时候并不会知道(特别是与别人对接开发工作的时候)对象中具有的属性与方法。

这个时候我们并不能直接通过 .或者查看底层的 __dict__ 方法来获得该对象下的属性与方法,我们需要使用一种更文明的方式来获取该对象下的属性与方法,故这种文明的方式被称之为反射。

自省和反射是两个比较专业化的术语,首先自省是获取对象的能力,而反射是操纵对象的能力。

Python中使用delattr()和setattr()实现反射,而其他方法则属于自省。

反射和自省常常组合使用!

Python中关于反射与自省的部分方法 
常用方法
dir() 返回一个列表,存储该对象下能被 . 出的所有属性与方法。
hasattr() 查看对象是否具有某种属性或方法,返回True或者False。
getattr() 获取对象下的某一属性或方法。如被获取对象没有相应的属性或方法,则可以为其设置默认值。
setattr() 设置对象下的某一属性的值,通常我们不会在对象外部为其新增某一方法,而是在在对象的类中进行设置。
delattr() 删除对象中的某一属性或方法。
其他的一些方法 
help() 获取对象的帮助信息,注意。没有返回值!内部会调用print()进行打印操作。
issubclass() 判断一个类是不是另一个类的子类
isinstance() 判断一个对象是否是一个已知的类型
id() 返回存储对象的内存地址编号
callable() 判断对象是否可调用

注意:于一切皆对象的原则,我们不仅可以对实例对象进行自省与反射,也可以对类对象进行自省与反射。

操作演示

应用场景

# ==== 这样做的好处是即使用户输入有误,也不会抛出异常 ====

import sys

class DownloadAndUpload(object):

  def __init__(self):
    self.val = sys.argv[1]
    self.select()

  def download(self):
    print("正在下载...")

  def upload(self):
    print("正在上传...")

  def select(self):
    if hasattr(self,self.val):
      getattr(self,self.val)()
    else:
      print("没有该方法")
DownloadAndUpload()

Python自省及反射原理实例详解

扩展与后言:反射内部实现机制

其实我想了好一会要不要写这个,内部实现机制。这一些内容应该放在双下方法学完之后才应该讲反射实现的内部机制。所以这里提一嘴:

  • hasattr() : __getattribute__ 有则返回,无则捕捉异常返回False。
  • getattr() :这个应该是在描述符之后进行讲解,实际上还是对__dict__进行操作。
  • setattr() : 调用内部__setattr__ 对 __dict__ 进行操作。Ps:实例对象调用时检查其类及其父类,类对象调用时检查其父类或者元类。
  • delattr() :调用__delattr__ 对 __dict__ 进行操作。Ps:实例对象调用时检查其类及其父类,类对象调用时检查其父类或者元类。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 控制语句
Nov 03 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
Python实现KNN邻近算法
Jan 28 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
django 2.2和mysql使用的常见问题
Jul 18 Python
基于Python实现签到脚本过程解析
Oct 25 Python
python 循环数据赋值实例
Dec 02 Python
Pytest mark使用实例及原理解析
Feb 22 Python
python自动点赞功能的实现思路
Feb 26 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
May 18 Python
python实现图书馆抢座(自动预约)功能的示例代码
Sep 29 Python
如何通过命令行进入python
Jul 06 #Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 #Python
python else语句在循环中的运用详解
Jul 06 #Python
Keras模型转成tensorflow的.pb操作
Jul 06 #Python
python如何进入交互模式
Jul 06 #Python
python3.4中清屏的处理方法
Jul 06 #Python
Python3基于print打印带颜色字符串
Jul 06 #Python
You might like
杏林同学录(五)
2006/10/09 PHP
php框架Phpbean说明
2008/01/10 PHP
php模板之Phpbean的目录结构
2008/01/10 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
[35:55]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.11
2020/12/13 DOTA
python 实现堆排序算法代码
2012/06/05 Python
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
使用Python对Csv文件操作实例代码
2017/05/12 Python
python实现ip地址的包含关系判断
2020/02/07 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
详解python中的异常和文件读写
2021/01/03 Python
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
体育专业个人求职信范文
2013/12/27 职场文书
五四青年节优秀演讲稿范文
2014/05/28 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
Python jiaba库的使用详解
2021/11/23 Python
linux下安装redis图文详细步骤
2021/12/04 Redis
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫