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 time模块用法实例详解
Sep 11 Python
使用Django和Python创建Json response的方法
Mar 26 Python
python操作xlsx文件的包openpyxl实例
May 03 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
django连接mysql数据库及建表操作实例详解
Dec 10 Python
在Python中通过threshold创建mask方式
Feb 19 Python
Python气泡提示与标签的实现
Apr 01 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
Apr 24 Python
python交互模式基础知识点学习
Jun 18 Python
Keras模型转成tensorflow的.pb操作
Jul 06 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 Python
Python中request的基本使用解决乱码问题
Apr 12 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
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
php建立Ftp连接的方法
2015/03/07 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
降低PHP Redis内存占用
2017/03/23 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
2010/01/22 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
2013/07/16 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
JavaScript使用ZeroClipboard操作剪切板
2017/05/10 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
Python中set与frozenset方法和区别详解
2016/05/23 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
python交换两个变量的值方法
2019/01/12 Python
python实现视频分帧效果
2019/05/31 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
如何提高python 中for循环的效率
2020/04/15 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
政协调研汇报材料
2014/08/15 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL
Python基础数据类型tuple元组的概念与用法
2021/08/02 Python
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技