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实现Sqlite将字段当做索引进行查询的方法
Jul 21 Python
通过Python实现自动填写调查问卷
Sep 06 Python
机器学习python实战之决策树
Nov 01 Python
Sanic框架Cookies操作示例
Jul 17 Python
TensorFlow实现Logistic回归
Sep 07 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
Python + OpenCV 实现LBP特征提取的示例代码
Jul 11 Python
python Jupyter运行时间实例过程解析
Dec 13 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 Python
Python如何给函数库增加日志功能
Aug 04 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
利用python做表格数据处理
Apr 13 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生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
Jquery ui css framework
2010/06/28 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
[01:46]辉夜杯—打造中国DOTA新格局
2015/12/25 DOTA
利用python实现汉字转拼音的2种方法
2019/08/12 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
如何用SQL语句进行模糊查找
2015/09/25 面试题
工程造价专业大学生自荐信
2013/10/01 职场文书
写给妈妈的道歉信
2014/01/11 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
面试必备的求职信
2014/05/25 职场文书
个人贷款收入证明
2014/10/26 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
求职自我推荐信
2015/03/24 职场文书
文艺委员竞选稿
2015/11/19 职场文书
Vue h函数的使用详解
2022/02/18 Vue.js