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基础知识_浅谈用户交互
May 31 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
tensorflow训练中出现nan问题的解决
Feb 10 Python
python web.py开发httpserver解决跨域问题实例解析
Feb 12 Python
Python使用win32 COM实现Excel的写入与保存功能示例
May 03 Python
Python读写zip压缩文件的方法
Aug 29 Python
在PyCharm中实现关闭一个死循环程序的方法
Nov 29 Python
使用python实现男神女神颜值打分系统(推荐)
Oct 31 Python
使用openCV去除文字中乱入的线条实例
Jun 02 Python
Python变量及数据类型用法原理汇总
Aug 06 Python
Python实现EM算法实例代码
Oct 04 Python
Python 列表推导式需要注意的地方
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中使用Oracle数据库(6)
2006/10/09 PHP
PHP禁止页面缓存的代码
2011/10/23 PHP
Linux中为php配置伪静态
2014/12/17 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
javascrip客户端验证文件大小及文件类型并重置上传
2011/01/12 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
javascript实现框架高度随内容改变的方法
2015/07/23 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
python 从远程服务器下载东西的代码
2013/02/10 Python
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
对python 操作solr索引数据的实例详解
2018/12/07 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
python自动生成证件号的方法示例
2021/01/14 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
教师的实习自我鉴定
2013/12/17 职场文书
趣味运动会活动方案
2014/02/12 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
音乐之声观后感
2015/06/04 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android