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 文件操作的详解及实例
Sep 18 Python
python ansible服务及剧本编写
Dec 29 Python
Python异常对代码运行性能的影响实例解析
Feb 08 Python
python调用动态链接库的基本过程详解
Jun 19 Python
使用Python计算玩彩票赢钱概率
Jun 26 Python
手把手教你Python yLab的绘制折线图的画法
Oct 23 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
解决python 执行sql语句时所传参数含有单引号的问题
Jun 06 Python
Python求区间正整数内所有素数之和的方法实例
Oct 13 Python
Python OpenCV快速入门教程
Apr 17 Python
Python实现简单的俄罗斯方块游戏
Sep 25 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
php后台程序与Javascript的两种交互方式
2009/10/25 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
Webpack打包字体font-awesome的方法示例
2018/04/26 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
React SSR样式及SEO的实践
2018/10/22 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
js原生map实现的方法总结
2020/01/19 Javascript
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
python3 打开外部程序及关闭的示例
2018/11/06 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
如何整合JQuery和Prototype
2014/01/31 面试题
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
工作中的自我评价如何写好
2013/10/28 职场文书
店面销售职位的职责
2014/03/09 职场文书
卫生巾广告词
2014/03/18 职场文书
安全生产管理责任书
2014/04/16 职场文书
承诺书格式范文
2014/06/03 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
考试没考好检讨书
2015/05/06 职场文书
学生会干部任命书
2015/09/21 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python