小结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入门篇之字典
Oct 17 Python
python对象及面向对象技术详解
Jul 19 Python
python模块简介之有序字典(OrderedDict)
Dec 01 Python
python利用拉链法实现字典方法示例
Mar 25 Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 Python
python针对excel的操作技巧
Mar 13 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
python利用7z批量解压rar的实现
Aug 07 Python
Python通过2种方法输出带颜色字体
Mar 02 Python
Python图像处理二值化方法实例汇总
Jul 24 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中ob_start函数的使用说明
2013/11/11 PHP
PHP开发注意事项总结
2015/02/04 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
简单实现php上传文件功能
2017/09/21 PHP
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
JavaScript实现简单评论功能
2017/08/17 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
判断网页编码的方法python版
2016/08/12 Python
Python中scatter函数参数及用法详解
2017/11/08 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
详解python 注释、变量、类型
2018/08/10 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
Python表达式的优先级详解
2020/02/18 Python
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
NEW LOOK官网:英国时装零售巨头之一,快时尚品牌
2017/01/11 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
蔬菜基地的创业计划书
2014/01/06 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
幼儿园秋游感想
2014/03/12 职场文书
学校节能减排倡议书
2014/05/16 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
小程序实现文字循环滚动动画
2021/06/14 Javascript
Nginx实现负载均衡的项目实践
2022/03/18 Servers