小结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 11 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
python版本五子棋的实现代码
Dec 11 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
解决安装pyqt5之后无法打开spyder的问题
Dec 13 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
django模型动态修改参数,增加 filter 字段的方式
Mar 16 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
Jun 29 Python
Python 虚拟环境工作原理解析
Dec 24 Python
plt.figure()参数使用详解及运行演示
Jan 08 Python
代码复现python目标检测yolo3详解预测
May 06 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
PHP7匿名类用法分析
2016/09/26 PHP
Javascript 面向对象 重载
2010/05/13 Javascript
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
潜说js对象和数组
2011/05/25 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
Bootstrap学习笔记之js组件(4)
2016/06/12 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
Python pass详细介绍及实例代码
2016/11/24 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
2017/03/24 Python
python矩阵的转置和逆转实例
2018/12/12 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
python实现遍历文件夹图片并重命名
2020/03/23 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
对python中list的五种查找方法说明
2020/07/13 Python
如何在python中实现线性回归
2020/08/10 Python
python使用建议技巧分享(三)
2020/08/18 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
天巡全球:Skyscanner Global
2017/06/20 全球购物
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
法学研究生自我鉴定范文
2013/12/04 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
英语教师求职信
2014/06/16 职场文书
小学学校门卫岗位职责
2014/08/03 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
2015年学校关工委工作总结
2015/04/03 职场文书
检察院起诉书
2015/05/20 职场文书
英语读书笔记
2015/07/02 职场文书