小结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判断字符串是否纯数字的方法
Nov 19 Python
Python读取图片属性信息的实现方法
Sep 11 Python
使用python 爬虫抓站的一些技巧总结
Jan 10 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
详解Python学习之安装pandas
Apr 16 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 Python
使用python对多个txt文件中的数据进行筛选的方法
Jul 10 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
Python利用PyExecJS库执行JS函数的案例分析
Dec 18 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
Pytorch实现神经网络的分类方式
Jan 08 Python
Python 防止死锁的方法
Jul 29 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伪静态写法附代码
2008/06/20 PHP
PHP 遍历XP文件夹下所有文件
2008/11/27 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
用户注册常用javascript代码
2009/08/29 Javascript
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之二
2011/12/31 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
js控制网页背景音乐播放与停止的方法
2015/02/06 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
2015/09/26 Javascript
详细讲解JavaScript中的this绑定
2016/10/10 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
vue.js实现备忘录功能的方法
2017/07/10 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
简述vue-cli中chainWebpack的使用方法
2019/07/30 Javascript
vue中路由跳转不计入history的操作
2020/09/21 Javascript
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
jupyter实现重新加载模块
2020/04/16 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
美国购物网站:Clickhere2shop
2021/01/28 全球购物
为什么要做架构设计
2015/07/08 面试题
幼儿园中秋节活动反思
2014/02/16 职场文书
英语教师求职信
2014/06/16 职场文书
幼儿园家长安全责任书
2014/07/22 职场文书