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读取TXT到数组及列表去重后按原来顺序排序的方法
Jun 26 Python
Python argv用法详解
Jan 08 Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
python中快速进行多个字符替换的方法小结
Dec 15 Python
python中logging包的使用总结
Feb 28 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 Python
一行python实现树形结构的方法
Aug 09 Python
用python生成与调用cntk模型代码演示方法
Aug 26 Python
python 使用递归实现打印一个数字的每一位示例
Feb 27 Python
Python 判断时间是否在时间区间内的实例
May 16 Python
python 获取字典键值对的实现
Nov 12 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
如何取得中文字符串中出现次数最多的子串
2013/08/08 PHP
win平台安装配置Nginx+php+mysql 环境
2016/01/12 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
实现点击列表弹出列表索引的两种方式
2013/03/08 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
基于vue.js中事件修饰符.self的用法(详解)
2018/02/23 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
[01:27]2014DOTA2展望TI 剑指西雅图IG战队专访
2014/06/30 DOTA
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
Python中无限元素列表的实现方法
2014/08/18 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
Django app配置多个数据库代码实例
2019/12/17 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
tensorflow实现对张量数据的切片操作方式
2020/01/19 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
大学生求职简历的自我评价范文
2013/10/12 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
windows安装python超详细图文教程
2021/05/21 Python
alibaba seata服务端具体实现
2022/02/24 Java/Android
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸