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",30) # 添加一个变量age,复制为30 print(p.age) # 打印结果:30
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) # 此时将报错