小结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编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
python+selenium+autoit实现文件上传功能
Aug 23 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
Apr 02 Python
Numpy 将二维图像矩阵转换为一维向量的方法
Jun 05 Python
详解Python下ftp上传文件linux服务器
Jun 21 Python
python爬虫之urllib3的使用示例
Jul 09 Python
python调用摄像头拍摄数据集
Jun 01 Python
Django基础知识 web框架的本质详解
Jul 18 Python
python树的同构学习笔记
Sep 14 Python
python数据类型可变不可变知识点总结
Mar 06 Python
Python基于Hypothesis测试库生成测试数据
Apr 29 Python
python基于opencv批量生成验证码的示例
Apr 28 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/01/02 PHP
php中mysql模块部分功能的简单封装
2011/09/30 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
php提交过来的数据生成为txt文件
2016/04/28 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
JQuery live函数
2010/12/24 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
2018/09/10 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
Python2.x中str与unicode相关问题的解决方法
2015/03/30 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
python django生成迁移文件的实例
2019/08/31 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
python中with用法讲解
2020/02/07 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
合作意向书范本
2014/03/31 职场文书
竞选卫生委员演讲稿
2014/04/28 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
车辆转让协议书
2014/09/24 职场文书
实施意见格式范本
2015/06/05 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server
Java8 CompletableFuture 异步回调
2022/04/28 Java/Android