小结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 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
python网络编程学习笔记(三):socket网络服务器
Jun 09 Python
Python用模块pytz来转换时区
Aug 19 Python
Python安装Numpy和matplotlib的方法(推荐)
Nov 02 Python
Python的地形三维可视化Matplotlib和gdal使用实例
Dec 09 Python
python实现数据预处理之填充缺失值的示例
Dec 22 Python
python pandas 如何替换某列的一个值
Jun 09 Python
python实现批量修改服务器密码的方法
Aug 13 Python
Python networkx包的实现
Feb 14 Python
新手入门学习python Numpy基础操作
Mar 02 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
OpenCV利用python来实现图像的直方图均衡化
Oct 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中simplexml_load_string函数使用说明
2011/01/01 PHP
php获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
php计算年龄精准到年月日
2015/11/17 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
2019/09/27 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
ECMAScript6--解构
2017/03/30 Javascript
javascript cookie的基本操作(添加和删除)
2017/07/24 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
详解小程序input框失焦事件在提交事件前的处理
2019/05/05 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
[01:03:51]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第三场
2018/04/09 DOTA
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
Python基础语言学习笔记总结(精华)
2017/11/14 Python
破解安装Pycharm的方法
2018/10/19 Python
Pandas读取并修改excel的示例代码
2019/02/17 Python
python 弧度与角度互转实例
2020/04/15 Python
初中音乐教学反思
2014/01/12 职场文书
学生会主席事迹材料
2014/01/28 职场文书
环保小标语
2014/06/13 职场文书
奉献家乡演讲稿
2014/09/16 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
python文件名批量重命名脚本实例代码
2021/04/22 Python
python实现语音常用度量方法的代码详解
2021/05/25 Python