小结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的Twisted框架中reactor事件管理器的用法
May 25 Python
PyTorch学习笔记之回归实战
May 28 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
对python产生随机的二维数组实例详解
Dec 13 Python
python将视频转换为全字符视频
Apr 26 Python
创建Django项目图文实例详解
Jun 06 Python
用python的turtle模块实现给女票画个小心心
Nov 23 Python
django数据模型(Model)的字段类型解析
Dec 25 Python
解决python3插入mysql时内容带有引号的问题
Mar 02 Python
python实现单张图像拼接与批量图片拼接
Mar 23 Python
Django 用户登陆访问限制实例 @login_required
May 13 Python
python 将Excel转Word的示例
Mar 02 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 CLI实现简单的数据库实时监控调度
2009/07/01 PHP
PHP Session变量不能传送到下一页的解决方法
2009/11/27 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
php修改指定文件后缀的方法
2014/09/11 PHP
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
js日期、星座的级联显示代码
2014/01/23 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
node-sass安装失败的原因与解决方法
2017/09/04 Javascript
vue-resource + json-server模拟数据的方法
2017/11/02 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
小程序Scroll-view上拉滚动刷新数据
2020/06/21 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Python中一般处理中文的几种方法
2019/03/06 Python
Python中请不要再用re.compile了
2019/06/30 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
python中Lambda表达式详解
2019/11/20 Python
Python实现FLV视频拼接功能
2020/01/21 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
北京SQL新华信咨询
2016/09/30 面试题
实习生自荐信范文分享
2013/11/27 职场文书
单身联谊活动方案
2014/01/29 职场文书
职工运动会感言
2014/02/07 职场文书
运动会通讯稿200字
2014/02/16 职场文书
晨会主持词
2014/03/17 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
学党史心得体会
2014/09/05 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
离职信范文
2015/06/23 职场文书