小结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 httplib,smtplib使用方法
Sep 06 Python
Python中使用Beautiful Soup库的超详细教程
Apr 30 Python
Python多进程分块读取超大文件的方法
Apr 13 Python
Python 窗体(tkinter)按钮 位置实例
Jun 13 Python
python使用minimax算法实现五子棋
Jul 29 Python
python实现屏保程序(适用于背单词)
Jul 30 Python
django 环境变量配置过程详解
Aug 06 Python
Django 自定义分页器的实现代码
Nov 24 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
Python2.x与3​​.x版本有哪些区别
Jul 09 Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 Python
Python&Matlab实现灰狼优化算法的示例代码
Mar 21 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 动态生成静态HTML页面示例代码
2014/01/15 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
jquery 选择器引擎sizzle浅析
2013/02/06 Javascript
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
jquery使用remove()方法删除指定class子元素
2015/03/26 Javascript
javascript表单验证大全
2015/08/12 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
JavaScript 巧学巧用
2017/05/23 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
js实现简单掷骰子小游戏
2019/10/24 Javascript
js实现烟花特效
2020/03/02 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
Python3实现连接SQLite数据库的方法
2014/08/23 Python
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
2015/02/04 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
python 如何上传包到pypi
2020/12/24 Python
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
法制宣传实施方案
2014/03/13 职场文书
个人合作协议书范本
2014/04/18 职场文书
市场营销计划书范文
2015/01/16 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技
Python数据结构之队列详解
2022/03/21 Python