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登录Gmail并发送Gmail邮件的教程
Apr 17 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
Jun 29 Python
Python中str.format()详解
Mar 12 Python
Python实现破解猜数游戏算法示例
Sep 25 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
Python实现的购物车功能示例
Feb 11 Python
python实现求两个字符串的最长公共子串方法
Jul 20 Python
Python的bit_length函数来二进制的位数方法
Aug 27 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
使用python处理题库表格并转化为word形式的实现
Apr 14 Python
通过Python扫描代码关键字并进行预警的实现方法
May 24 Python
Python 实现进度条的六种方式
Jan 06 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+ACCESS 文章管理程序代码
2010/06/21 PHP
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
layui form.render('select', 'test2') 更新渲染的方法
2019/09/27 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
Python unittest如何生成HTMLTestRunner模块
2020/09/08 Python
记录一下scrapy中settings的一些配置小结
2020/09/28 Python
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
如何执行一个shell程序
2012/11/23 面试题
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
golang 实现两个结构体复制字段
2021/04/28 Golang
MySQL事务的隔离级别详情
2022/07/15 MySQL
一文解答什么是MySQL的回表
2022/08/05 MySQL