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批量修改文件后缀的方法
Jan 26 Python
跟老齐学Python之集合(set)
Sep 24 Python
Python入门篇之条件、循环
Oct 17 Python
Python爬虫框架Scrapy常用命令总结
Jul 26 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
python日期相关操作实例小结
Jun 24 Python
Python判断三段线能否构成三角形的代码
Apr 12 Python
python实现俄罗斯方块小游戏
Apr 24 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
Python csv文件记录流程代码解析
Jul 16 Python
基于python模拟bfs和dfs代码实例
Nov 19 Python
浅谈Python中的函数(def)及参数传递操作
May 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中一个控制字符串输出的函数
2006/10/09 PHP
php入门小知识
2008/03/24 PHP
有关于PHP中常见数据类型的汇总分享
2014/01/06 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
javascript 尚未实现错误解决办法
2008/11/27 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
Python编程中对文件和存储器的读写示例
2016/01/25 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
python实现杨氏矩阵查找
2019/03/02 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
Ajax的优点和缺点
2014/11/21 面试题
超市促销实习自我鉴定
2013/09/23 职场文书
银行实习鉴定
2013/12/13 职场文书
中专生职业生涯规划书范文
2013/12/29 职场文书
幼儿园教师节演讲稿
2014/09/03 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang