小结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 相关文章推荐
Python3 中文文件读写方法
Jan 23 Python
用Eclipse写python程序
Feb 10 Python
Python基于dom操作xml数据的方法示例
May 12 Python
Python实现打砖块小游戏代码实例
May 18 Python
Pandas中Series和DataFrame的索引实现
Jun 27 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
Aug 27 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
Python常用类型转换实现代码实例
Jul 28 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
python如何进行基准测试
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
Drupal简体中文语言包安装教程
2014/09/27 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
将PHP程序中返回的JSON格式数据用gzip压缩输出的方法
2016/03/03 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
js 阻止子元素响应父元素的onmouseout事件具体实现
2013/12/23 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
非常实用的vue导航钩子
2017/03/20 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
python select.select模块通信全过程解析
2017/09/20 Python
Python_LDA实现方法详解
2017/10/25 Python
Python subprocess模块详细解读
2018/01/29 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
在python中实现强制关闭线程的示例
2019/01/22 Python
python+opencv像素的加减和加权操作的实现
2019/07/14 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
python如何输出反斜杠
2020/06/18 Python
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
建筑专业自荐信
2013/10/18 职场文书
模具数控专业自荐信
2014/01/27 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
大学推普周活动总结
2015/05/07 职场文书
JS的深浅复制详细
2021/10/16 Javascript