小结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实现的数据结构与算法之链表详解
Apr 22 Python
Python单例模式的两种实现方法
Aug 14 Python
Python面向对象class类属性及子类用法分析
Feb 02 Python
python Pandas 读取txt表格的实例
Apr 29 Python
浅谈python写入大量文件的问题
Nov 09 Python
python实现事件驱动
Nov 21 Python
Django模型序列化返回自然主键值示例代码
Jun 12 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
python 实现PIL模块在图片画线写字
May 16 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
Python 3.9的到来到底是意味着什么
Oct 14 Python
python 读取串口数据的示例
Nov 09 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 不使用js实现页面跳转
2014/02/11 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
2015/03/19 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
2014/06/09 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
jQuery在ul中显示某个li索引号的方法
2015/03/17 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
Python中的rjust()方法使用详解
2015/05/19 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
美国最大网上鞋店:Zappos
2016/07/25 全球购物
const和static readonly区别
2013/05/20 面试题
财务方面个人工作的自我评价
2013/12/28 职场文书
服务之星获奖感言
2014/01/21 职场文书
如何写好建议书
2014/03/13 职场文书
布达拉宫导游词
2015/02/02 职场文书
任命书标准格式
2015/03/02 职场文书
南京大屠杀观后感
2015/06/02 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
MySQL学习必备条件查询数据
2022/03/25 MySQL