小结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 数据加密代码
Dec 24 Python
python中日期和时间格式化输出的方法小结
Mar 19 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
numpy给array增加维度np.newaxis的实例
Nov 01 Python
对python遍历文件夹中的所有jpg文件的实例详解
Dec 08 Python
python 3.3 下载固定链接文件并保存的方法
Dec 18 Python
python执行精确的小数计算方法
Jan 21 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
Django ORM 查询表中某列字段值的方法
Apr 30 Python
python语言是免费还是收费的?
Jun 15 Python
python 生成器需注意的小问题
Sep 29 Python
Python绘制K线图之可视化神器pyecharts的使用
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
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
php 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
JavaScript数据结构链表知识详解
2016/11/21 Javascript
手动初始化Angular的模块与控制器
2016/12/26 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
Angular2之二级路由详解
2018/08/31 Javascript
使用ESLint禁止项目导入特定模块的方法步骤
2019/03/04 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
2020/12/25 Vue.js
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
ubuntu中配置pyqt4环境教程
2017/12/27 Python
python微信公众号开发简单流程
2018/03/23 Python
Python实现按中文排序的方法示例
2018/04/25 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
资产评估专业学生的自我鉴定
2013/11/14 职场文书
应届实习生的自我评价范文
2014/01/05 职场文书
自荐信写法介绍
2014/01/25 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
绿色环保口号
2014/06/12 职场文书
主题团日活动总结
2014/06/25 职场文书
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
python3读取文件指定行的三种方法
2021/05/24 Python