小结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 17 Python
简单的Apache+FastCGI+Django配置指南
Jul 22 Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 Python
Python学生信息管理系统修改版
Mar 13 Python
Python面向对象基础入门之编码细节与注意事项
Dec 11 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
python导入不同目录下的自定义模块过程解析
Nov 18 Python
基于python连接oracle导并出数据文件
Apr 28 Python
520使用Python实现“我爱你”表白
May 20 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
python调用摄像头的示例代码
Sep 28 Python
详解Selenium 元素定位和WebDriver常用方法
Dec 04 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之COOKIE支持详解
2010/09/20 PHP
php结合表单实现一些简单功能的例子
2011/06/04 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
2017/05/12 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
python 将有序数组转换为二叉树的方法
2019/03/26 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
Python虚拟环境venv用法详解
2020/05/25 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
学校运动会霸气口号
2014/06/07 职场文书
经济管理专业求职信
2014/06/09 职场文书
小学领导班子对照材料
2014/08/23 职场文书
2016年元旦致辞
2015/08/01 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python
mysql数据库隔离级别详解
2022/06/16 MySQL