小结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 相关文章推荐
python中黄金分割法实现方法
May 06 Python
python实现的多线程端口扫描功能示例
Jan 21 Python
win10环境下python3.5安装步骤图文教程
Feb 03 Python
python中Apriori算法实现讲解
Dec 10 Python
一篇文章快速了解Python的GIL
Jan 12 Python
python 多线程重启方法
Feb 18 Python
浅谈图像处理中掩膜(mask)的意义
Feb 19 Python
Jupyter Notebook折叠输出的内容实例
Apr 22 Python
Python bisect模块原理及常见实例
Jun 17 Python
Python制作一个随机抽奖小工具的实现
Jul 07 Python
Python matplotlib 利用随机函数生成变化图形
Apr 26 Python
Python内置类型集合set和frozenset的使用详解
Apr 26 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
js获取提交的字符串的字节数
2009/02/09 Javascript
JavaScript Date对象使用总结
2009/05/14 Javascript
javascript中input中readonly和disabled区别介绍
2012/10/23 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
2017/01/05 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
微信小程序实现留言功能
2018/10/31 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
2020/03/03 Javascript
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
Python学习笔记之os模块使用总结
2014/11/03 Python
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
Django框架 信号调度原理解析
2019/09/04 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
Django用户身份验证完成示例代码
2020/04/03 Python
大学生学年自我鉴定
2014/02/10 职场文书
就业协议书怎么填
2014/04/11 职场文书
公司回复函格式
2015/07/14 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
用python修改excel表某一列内容的操作方法
2021/06/11 Python
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript