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 socket编程实例详解
May 27 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
python散点图实例之随机漫步
Aug 27 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
Dec 16 Python
python利用dlib获取人脸的68个landmark
Nov 27 Python
Python计算公交发车时间的完整代码
Feb 12 Python
Python openpyxl 插入折线图实例
Apr 17 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
Dec 24 Python
写好Python代码的几条重要技巧
May 21 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 Socket技术
2013/08/02 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
PHP实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
jquery prop的使用介绍及与attr的区别
2013/12/19 Javascript
js opener的使用详解
2014/01/11 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
详解AngularJS的通信机制
2015/06/18 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
JavaScript编写一个贪吃蛇游戏
2017/03/09 Javascript
vue中如何引入jQuery和Bootstrap
2017/04/10 jQuery
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
Python简单生成8位随机密码的方法
2017/05/24 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
python requests 测试代理ip是否生效
2018/07/25 Python
对Django url的几种使用方式详解
2019/08/06 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
趣味游戏活动方案
2014/02/07 职场文书
社团活动总结范文
2014/04/26 职场文书
媒矿安全生产承诺书
2014/05/23 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
2015中学教学工作总结
2015/07/22 职场文书
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL
选购到合适的激光打印机
2022/04/21 数码科技
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python