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 文件操作实现代码
Oct 07 Python
Python中的闭包总结
Sep 18 Python
Python检测一个对象是否为字符串类的方法
May 21 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
20招让你的Python飞起来!
Sep 27 Python
对python实现模板生成脚本的方法详解
Jan 30 Python
Python 串口读写的实现方法
Jun 12 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
pytorch中的自定义数据处理详解
Jan 06 Python
pytorch masked_fill报错的解决
Feb 18 Python
Python设计密码强度校验程序
Jul 30 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
PHP基础陷阱题(变量赋值)
2012/09/12 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
PHP中文编码小技巧
2014/12/25 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
JS编程小常识很有用
2012/11/26 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
JS中的==运算: [''] == false —>true
2016/07/24 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
CentOS6.5设置Django开发环境
2016/10/13 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
四川成都导游欢迎词
2014/01/18 职场文书
九年级体育教学反思
2014/01/23 职场文书
篮球赛口号
2014/06/18 职场文书
房屋租赁授权委托书范本
2014/09/20 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
团委工作总结2015
2015/04/02 职场文书
R9700摩机记
2022/04/05 无线电