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 相关文章推荐
在Linux系统上安装Python的Scrapy框架的教程
Jun 11 Python
python生成excel的实例代码
Nov 08 Python
python图书管理系统
Apr 05 Python
python Opencv将图片转为字符画
Feb 19 Python
python二维列表一维列表的互相转换实例
Jul 02 Python
Django forms组件的使用教程
Oct 08 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
python中return如何写
Jun 18 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
Jun 24 Python
python脚本和网页有何区别
Jul 02 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 Python
两行代码解决Jupyter Notebook中文不能显示的问题
Apr 24 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 intval的测试代码发现问题
2008/07/27 PHP
PHP 变量定义和变量替换的方法
2009/07/30 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
好好了解一下Cookie(强烈推荐)
2016/06/14 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
js定时器实例分享
2016/12/20 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
通过js随机函数Math.random实现乱序
2020/05/19 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
Python标准库内置函数complex介绍
2014/11/25 Python
python将文本转换成图片输出的方法
2015/04/28 Python
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
python中的函数递归和迭代原理解析
2019/11/14 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
常见的软件开发流程有哪些
2015/11/14 面试题
销售顾问的岗位职责
2013/11/13 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
异地恋情人节寄语
2015/02/28 职场文书
赢在执行观后感
2015/06/16 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
解决xampp安装后Apache无法启动
2022/03/21 Servers
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫
Python日志模块logging用法
2022/06/05 Python