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 相关文章推荐
在Django框架中设置语言偏好的教程
Jul 27 Python
Win10下Python环境搭建与配置教程
Nov 18 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
Jul 24 Python
python实现简单中文词频统计示例
Nov 08 Python
Python实现的堆排序算法示例
Apr 29 Python
celery4+django2定时任务的实现代码
Dec 23 Python
python  文件的基本操作 菜中菜功能的实例代码
Jul 17 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
python中web框架的自定义创建
Sep 08 Python
python3+openCV 获取图片中文本区域的最小外接矩形实例
Jun 02 Python
pytorch实现查看当前学习率
Jun 24 Python
解决Python 写文件报错TypeError的问题
Oct 23 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获取远程图片并把它保存到本地的代码
2008/04/07 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
JS处理VBArray的函数使用说明
2008/05/11 Javascript
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
Ruby元编程基础学习笔记整理
2016/07/02 Python
python文件名和文件路径操作实例
2017/09/29 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
python与mysql数据库交互的实现
2020/01/06 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
体育老师的教学自我评价分享
2013/11/19 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
学校安全管理责任书
2014/07/23 职场文书
医院党员公开承诺书
2014/08/30 职场文书
银行竞聘上岗演讲稿
2014/09/12 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
python实现双链表
2022/05/25 Python