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) # 此时将报错

最新文章

  1. 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题
  2. should be mapped with insert="false" update="false
  3. ae开发基础功能
  4. 通过源码理解UST(用户栈回溯)
  5. 【BZOJ】【1031】【JSOI2007】字符加密Cipher
  6. [AngularJS] TweenList 3D + AngularJS Animate
  7. backbone collection add 事件回调参数
  8. 基于Java的HashMap和HashSet实现
  9. nginx安装与挂载
  10. autium designer smart pdf一个小问题
  11. ajax01
  12. 『计算机视觉』感受野和anchor
  13. GetStockObject 理解
  14. MySQL中format()函数
  15. 解决 Boost安装:fatal error: bzlib.h: No such file or directory 问题
  16. Why is my Spring @Autowired field null?
  17. 【leetcode 桶排序】Maximum Gap
  18. HDU 2604 Queuing (矩阵乘法)
  19. Ajax-ajax实例1-动态加载的 FAQ
  20. 寻找hash值——把int array看成是一个整数

热门文章

  1. C++编程学习(八)new&delete动态内存分配
  2. JavaScript中querySelector()和getElementById()(getXXXByXX)的区别
  3. 杂记 -- 关于ref、kepp-alive、nextTick、fetch
  4. 九十八、SAP中ALV事件之十一,查看图片
  5. 08 SSM整合案例(企业权限管理系统):11.AOP日志
  6. Linux命令笔记一
  7. 【剑指Offer】面试题22. 链表中倒数第k个节点
  8. java web实现在线编辑word,并将word导出(二)
  9. php语言注意点
  10. su鉴定故障 普通用户无法切换回root用户处理-centos7网卡速率设置