小结Python的反射机制
作者:topass123 发布时间:2023-10-16 22:30:28
标签:python,反射
前言:
前两天用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) # 此时将报错
为什么用反射
好处一:
实现可插拔机制
可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定'
好处二:
动态导入模块(基于反射当前模块成员)
来源:https://www.cnblogs.com/topass123/archive/2004/01/13/12836081.html


猜你喜欢
- 在做数据库修改或删除操作中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库。本篇文章主要讲述Navicat for
- 废话不多说,直接上代码!updateBody = { "query":{ &nb
- 本文实例为大家分享了JavaScript实现简易轮播图效果的具体代码,供大家参考,具体内容如下全部代码:<!DOCTYPE html&
- 网络通信中,为了防止长时间无响应的情况,经常会用到网络连接超时、读写超时的设置。本文结合例子简介golang的连接超时和读写超时设置。1.超
- 列表渲染 key 的原理和作用key就是为该节点做身份标识,如果对key绑定index的值,那么很容易出现问题:1.若对数据进行:逆序添加、
- web 调试工具介绍和开发环境搭建python与selenium开发环境搭建:一、下载python软件:https://www.python
- 我们把一个事物进行分解,就可以得到其中的元素。对于python中的解包来说,也是同样的使用,相信大家从名称就可以观察出来了。那么在具体的解包
- 对于np.argmax()让我迷惑了很久,尤其是其中的axis=1的比较结果。一、np.argmax()的理解1、最简单的例子假定现在有一个
- 目录互斥锁读写互斥锁先来看这样一段代码,所存在的问题:var wg sync.WaitGroupvar x int64func main()
- 在平时开发中我们经常会用到 Webpack这个时下最流行的前端打包工具。它打包开发代码,输出能在各种浏览器运行的代码,提升了开发至发布过程的
- python 代码如下:# -*- coding:utf-8 -*-import pandas as pdimport pymysqlimp
- 今天遇到多条件搜索,其中需要用到in查询,但是laravel不支持 [ 'type', 'in', '
- 首先说一下 ,我是用的anaconda3装的pytorch为了方便建议你也安装一个。其实这个挺简单的,你找找“c:/user/你的用户名/”
- argparse是python标准库里面用来处理命令行参数的库命令行参数分为位置参数和选项参数:位置参数就是程序根据该参数出现的位置来确定的
- 一、watch使用的几种方法1、 通过 watch 监听 msg 数据的变化。watch: { msg(oldVa
- 说明写了一段时间的java之后,特别不习惯PHP本身的弱类型方式,在写代码的时候总觉得不怎么放心,特别本身PHP又是弱类型的语言,所以在编码
- 本文是小编针对JS删除数组里的某个元素这个大家经常遇到的经典问题整理了在各种情况下的函数写法以及遇到问题的分析,以下是全部内容:删除数组指定
- 代码如下: 在ie下,貌似要改安全设置中的【对为标记为可安全执行脚本的ActiveX空间初始化并执行】那项 <html> <
- SQL Server管理,你做得好吗?下文这些可能会对你的工作有一些帮助,不妨耐心的看看吧。1. 数据库文件有.mdf .ndf .ldf三
- 本文实例讲述了python实现定时同步本机与北京时间的方法。分享给大家供大家参考。具体如下:这段python代码首先从www.beijing