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 变量类型及命名规则介绍
Jun 08 Python
python中ConfigParse模块的用法
Sep 29 Python
Python中的类与对象之描述符详解
Mar 27 Python
使用python存储网页上的图片实例
May 22 Python
在python中利用最小二乘拟合二次抛物线函数的方法
Dec 29 Python
python 使用plt画图,去除图片四周的白边方法
Jul 09 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
Sep 22 Python
python实现跨excel sheet复制代码实例
Mar 03 Python
Python利用for循环打印星号三角形的案例
Apr 12 Python
Python unittest框架操作实例解析
Apr 13 Python
Python调用.net动态库实现过程解析
Jun 05 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
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
五个PHP程序员工具
2008/05/26 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
yii2使用ajax返回json的实现方法
2016/05/14 PHP
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
jquery ajax例子返回值详解
2012/09/11 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
vue iview实现动态路由和权限验证功能
2018/04/17 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
推荐下python/ironpython:从入门到精通
2007/10/02 Python
调用其他python脚本文件里面的类和方法过程解析
2019/11/15 Python
如何基于python操作json文件获取内容
2019/12/24 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
如何强制垃圾回收
2015/10/06 面试题
测试工程师程序员求职信范文
2014/02/20 职场文书
2014社区三八妇女节活动总结
2014/03/01 职场文书
车辆转让协议书
2014/09/24 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
培训讲师开场白
2015/06/01 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
python turtle绘图命令及案例
2021/11/23 Python