小结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本地与全局命名空间用法实例
Jun 16 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
Python中基础的socket编程实战攻略
Jun 01 Python
Python 基础知识之字符串处理
Jan 06 Python
python实现的AES双向对称加密解密与用法分析
May 02 Python
python学生信息管理系统(初级版)
Oct 17 Python
Python多进程写入同一文件的方法
Jan 14 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 Python
python3 实现口罩抽签的功能
Mar 11 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
Mar 17 Python
python Xpath语法的使用
Nov 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
图解上海144收音机
2021/03/02 无线电
PHP页面间传递参数实例代码
2008/06/05 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
js中有关IE版本检测
2012/01/04 Javascript
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
AngularJS中处理多个promise的方式
2016/02/02 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
jquery select2的使用心得(推荐)
2016/12/04 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
浅析python 中__name__ = '__main__' 的作用
2014/07/05 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
使用python求解二次规划的问题
2020/02/29 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
德国最大的拼图在线商店:Puzzle.de
2016/12/17 全球购物
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
个人自我鉴定写法
2013/11/30 职场文书
学生生病请假条范文
2014/02/16 职场文书
活动总结报告怎么写
2014/07/03 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
地球上的星星观后感
2015/06/02 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
python turtle绘图命令及案例
2021/11/23 Python
MySQL存储过程及语法详解
2022/08/05 MySQL