小结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的dict,set,list,tuple应用详解
Jul 24 Python
Python解释执行原理分析
Aug 22 Python
python实现给数组按片赋值的方法
Jul 28 Python
JavaScript中的模拟事件和自定义事件实例分析
Jul 27 Python
Python logging模块用法示例
Aug 28 Python
python-itchat 获取微信群用户信息的实例
Feb 21 Python
Python序列类型的打包和解包实例
Dec 21 Python
Python实现不规则图形填充的思路
Feb 02 Python
Python TKinter如何自动关闭主窗口
Feb 26 Python
Python HTTP下载文件并显示下载进度条功能的实现
Apr 02 Python
Python基于numpy模块实现回归预测
May 14 Python
python和go语言的区别是什么
Jul 20 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
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
JavaScript类库D
2010/10/24 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
node.js中的fs.symlink方法使用说明
2014/12/15 Javascript
node.js中的fs.rmdirSync方法使用说明
2014/12/16 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
ES6概念 ymbol.for()方法
2016/12/25 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
jQuery实现每隔一段时间自动更换样式的方法分析
2018/05/03 jQuery
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
使用python实现省市三级菜单效果
2016/01/20 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
Python实现八大排序算法
2016/08/13 Python
Django获取应用下的所有models的例子
2019/08/30 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
Python 绘制可视化折线图
2020/07/22 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
Why do we need Unit test
2013/01/03 面试题
如何写你的创业计划书
2014/01/07 职场文书
计算机专业优秀大学生自我总结
2014/01/21 职场文书
买卖车协议书
2014/04/21 职场文书
车辆工程专业求职信
2014/06/14 职场文书
刑事辩护词范文
2015/05/21 职场文书
家庭教育培训学习心得体会
2016/01/14 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python