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 10 Python
python 剪切移动文件的实现代码
Aug 02 Python
Python设计模式之解释器模式原理与用法实例分析
Jan 10 Python
Python基础教程之if判断,while循环,循环嵌套
Apr 25 Python
python 根据字典的键值进行排序的方法
Jul 24 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
Aug 17 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
Aug 20 Python
Python使用turtle库绘制小猪佩奇(实例代码)
Jan 16 Python
通过python 执行 nohup 不生效的解决
Apr 16 Python
python多进程下的生产者和消费者模型
May 07 Python
python 6行代码制作月历生成器
Sep 18 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 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
德生H-501的评价与改造
2021/03/02 无线电
PHP中常用数组处理方法实例分析
2008/08/30 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
详解PHP中的null合并运算符
2015/12/30 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
用js实现的页面关键字密度查询代码
2007/12/27 Javascript
js对象的构造和继承实现代码
2010/12/05 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
js相册效果代码(点击创建即可)
2013/04/16 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
通过javascript进行UTF-8编码的实现方法
2016/06/27 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
2016/12/31 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
angularjs实现分页和搜索功能
2018/01/03 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
Python实现从URL地址提取文件名的方法
2015/05/15 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
Python 类的私有属性和私有方法实例分析
2019/09/29 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
Staples加拿大官方网站:办公用品一站式采购
2016/09/25 全球购物
教师业务培训方案
2014/05/01 职场文书
优秀员工推荐信
2014/05/10 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
学习三严三实心得体会
2014/10/13 职场文书
高考学习决心书
2015/02/04 职场文书
少年犯观后感
2015/06/11 职场文书
SQL Server 中的事务介绍
2022/05/20 SQL Server