Python笔记_第四篇_高阶编程_反射_(getattr,setattr,deattr,hasattr)
2024-08-24 17:18:47
1. 元数据和反射概念:
有关程序及其类型的数据成为元数据(metadata),他保存在程序的程序集中。
反射这个词儿听起来比较陌生。程序在运行时,可以查看其它程序集或其本身的元数据。一个运行的程序查看本身的元数据的行为成为反射(reflection)
对象浏览器是显示元数据的程序的的一个示例。他可以读取程序集,然后显示所包含的类型及类型的所有特性和成员。
2.举例说明:
比如:我们现在有这样一个需求,已有三个函数fun1,fun2,fun3这三个函数,我们都找到如果我们想调用其中某个函数的时候,我们只有在代码中写好,
s.py
def fun2():
return "fun2" def fun1():
return 'fun1' def fun3():
return 'fun3'
test.py
import s #导入s.py文件。 call_str = input("input which function you want to call :") if call_str == 'fun1':
print(s.fun1())
elif call_str == 'fun2':
print(s.fun2())
elif call_str == 'fun3':
print(s.fun3())
else:
print("404 not Found")
运行文件test.py后输入对应的函数名就可以调用响应的函数了。如果在s.py文件中,有成千个函数!岂不是我们想象以上方式调用的时候写上n个判断语句,这样是不是太麻了。
所有Pyt给我们提供了强大的反射机制,这个反射机制是通过“字符串返回映射到代码中的一种机制”。
这边是反射的意思了。
3.Py中怎么使用反射:
其中Py中提供了四个反射函数
3.1 getattr函数:获取对象的方法或变量的内存地址
import s call_str = input("input which function you want to call :") # if call_str == 'fun1':
# print(s.fun1())
# elif call_str == 'fun2':
# print(s.fun2())
# elif call_str == 'fun3':
# print(s.fun3())
# else:
# print("404 not Found") obj = getattr(s, call_str) # 其中的s是值的带入的s文件,s也可以换为其他的你想倒入的模块等
print(obj()) input which function you want to call :fun1
fun1
运行后我们输入:fun1,fun2,fun3都没有问题,但是当我们乱输入一个字符串的时候getattr内置函数就报错了。当然,我们可以通过try...except语句进行判断这个问题。但是我们还可以使用hasattr这个内置函数。
3.2 hasatter函数:返回True or False
import s call_str = input("input which function you want to call :") if call_str == 'fun1':
print(s.fun1())
elif call_str == 'fun2':
print(s.fun2())
elif call_str == 'fun3':
print(s.fun3())
else:
print("404 not Found") if hasattr(s, call_str): # 判断是否存在函数 call_str,这样处理就不会报错了。
obj = getattr(s, call_str)
print(obj())
else:
print("404 not Found")
3.3 setattr函数:为对象添加变量或方法。
def abc(self):
print("%s正在交谈"%self.name) class Person(object):
def __init__(self,name):
self.name = name class Person(object):
def __init__(self,name):
self.name = name
def talk(self):
print("%s正在交谈"%self.name) p = Person("laowang")
setattr(p,"talk",abc) # 将abc函数添加到对象中p中,并命名为talk
p.talk(p) # 调用talk方法,因为这是额外添加的方法,需手动传入对象 setattr(p,"age",) # 添加一个变量age,复制为30
print(p.age) # 打印结果:
3.4 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) # 此时将报错
最新文章
- 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题
- should be mapped with insert=";false"; update=";false
- ae开发基础功能
- 通过源码理解UST(用户栈回溯)
- 【BZOJ】【1031】【JSOI2007】字符加密Cipher
- [AngularJS] TweenList 3D + AngularJS Animate
- backbone collection add 事件回调参数
- 基于Java的HashMap和HashSet实现
- nginx安装与挂载
- autium designer smart pdf一个小问题
- ajax01
- 『计算机视觉』感受野和anchor
- GetStockObject 理解
- MySQL中format()函数
- 解决 Boost安装:fatal error: bzlib.h: No such file or directory 问题
- Why is my Spring @Autowired field null?
- 【leetcode 桶排序】Maximum Gap
- HDU 2604 Queuing (矩阵乘法)
- Ajax-ajax实例1-动态加载的 FAQ
- 寻找hash值——把int array看成是一个整数
热门文章
- C++编程学习(八)new&;delete动态内存分配
- JavaScript中querySelector()和getElementById()(getXXXByXX)的区别
- 杂记 -- 关于ref、kepp-alive、nextTick、fetch
- 九十八、SAP中ALV事件之十一,查看图片
- 08 SSM整合案例(企业权限管理系统):11.AOP日志
- Linux命令笔记一
- 【剑指Offer】面试题22. 链表中倒数第k个节点
- java web实现在线编辑word,并将word导出(二)
- php语言注意点
- su鉴定故障 普通用户无法切换回root用户处理-centos7网卡速率设置