小结Python的反射机制


Posted in Python onSeptember 28, 2020

前言:

前两天用Python实现了ftp服务器。在小项目中就用到了反射。因此写个笔记巩固下。

反射的定义:检测和修改它本身状态或行为的一种能力(自省)。

而通过反射,Python可以通过字符串的映射或修改程序运行的状态和方法。

反射的四个方法。hasattr,getattr,setattr,delattr

hasattr:判断一个方法是否存在与这个类中

class Person(object):
  def __init__(self,name):
    self.name = name
  def talk(self):
    print("%s正在交谈"%self.name)

p = Person("laowang")    
print(hasattr(p,"talk"))  # True。因为存在talk方法
print(hasattr(p,"name"))  # True。因为存在name变量
print(hasattr(p,"abc"))   # False。因为不存在abc方法或变量

getattr:根据字符串去获取obj对象里的对应的方法的内存地址,加"()"括号即可执行

class Person(object):
  def __init__(self,name):
    self.name = name
  def talk(self):
    print("%s正在交谈"%self.name)
p = Person("laowang")

n = getattr(p,"name")  # 获取name变量的内存地址
print(n)        # 此时打印的是:laowang

f = getattr(p,"talk")  # 获取talk方法的内存地址
f()           # 调用talk方法

我们发现getattr有三个参数,那么第三个参数是做什么用的呢?
s = getattr(p,"abc","not find")
print(s)        # 打印结果:not find。因为abc在对象p中找不到,本应该报错,但因为修改了找不到就输出not find

setattr:通过setattr将外部的一个函数绑定到实例中

def abc(self):
  print("%s正在交谈"%self.name)

class Person(object):
  def __init__(self,name):
    self.name = name

p = Person("laowang")
setattr(p,"talk",abc)  # 将abc函数添加到对象中p中,并命名为talk
p.talk(p)        # 调用talk方法,因为这是额外添加的方法,需手动传入对象


setattr(p,"age",30)   # 添加一个变量age,复制为30
print(p.age)      # 打印结果:30

delattr:删除一个实例或者类中的方法

class Person(object):
  def __init__(self,name):
    self.name = name
  def talk(self):
    print("%s正在交谈"%self.name)

p = Person("laowang")

delattr(p,"name")    # 删除name变量
print(p.name)      # 此时将报错

为什么用反射

好处一:

实现可插拔机制

可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定'

好处二:

动态导入模块(基于反射当前模块成员)

以上就是小结Python的反射机制的详细内容,更多关于python 反射的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
tornado捕获和处理404错误的方法
Feb 26 Python
python实现计算资源图标crc值的方法
Oct 05 Python
pandas数据分组和聚合操作方法
Apr 11 Python
python实现批量解析邮件并下载附件
Jun 19 Python
django admin 后台实现三级联动的示例代码
Jun 22 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
python实现给微信指定好友定时发送消息
Apr 29 Python
Python读写文件模式和文件对象方法实例详解
Sep 17 Python
python常用排序算法的实现代码
Nov 08 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
python爬虫基础之urllib的使用
Dec 31 Python
python解包用法详解
Feb 17 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 #Python
scrapy结合selenium解析动态页面的实现
Sep 28 #Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 #Python
python 常见的反爬虫策略
Sep 27 #Python
python 5个实用的技巧
Sep 27 #Python
Python日志器使用方法及原理解析
Sep 27 #Python
python 爬取免费简历模板网站的示例
Sep 27 #Python
You might like
E路文章系统PHP
2006/12/11 PHP
php Rename 更改文件、文件夹名称
2011/05/24 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
php异常处理捕获错误整理
2019/09/23 PHP
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
Javascript for in的缺陷总结
2017/02/03 Javascript
Angular2下使用pdf插件的方法详解
2017/04/29 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
2019/06/13 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
Fanatics法国官网:美国体育电商
2019/08/27 全球购物
医学院学生求职简历的自我评价
2013/10/24 职场文书
高中军训的心得体会
2014/09/01 职场文书
先进教师个人总结
2015/02/11 职场文书
JS代码编译器Monaco使用方法
2021/06/11 Javascript
CSS3实现列表无限滚动/轮播效果
2021/06/23 HTML / CSS
解析目标检测之IoU
2021/06/26 Python
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python
关于Python使用turtle库画任意图的问题
2022/04/01 Python
Python使用永中文档转换服务
2022/05/06 Python