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多进程共享变量
Apr 06 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
Aug 20 Python
Python Django 添加首页尾页上一页下一页代码实例
Aug 21 Python
PyCharm更改字体和界面样式的方法步骤
Sep 27 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
pytorch自定义二值化网络层方式
Jan 07 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
python 实现图像快速替换某种颜色
Jun 04 Python
Ubuntu20下的Django安装的方法步骤
Jan 24 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
咖啡的植物学知识
2021/03/03 咖啡文化
给初学PHP的5个入手程序
2006/11/23 PHP
FleaPHP的安全设置方法
2008/09/15 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
php简单复制文件的方法
2016/05/09 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
理清apply(),call()的区别和关系
2011/08/14 Javascript
Underscore.js 的模板功能介绍与应用
2012/12/24 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
HTML5中FileReader接口使用方法实例详解
2017/08/26 HTML / CSS
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
物业管理个人自我评价
2013/11/08 职场文书
学生周末回家住宿长期请假条
2014/02/15 职场文书
家长学校实施方案
2014/03/15 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
生物技术专业求职信
2014/06/10 职场文书
研究生个人学年总结
2015/02/14 职场文书