一、什么是反射
Python反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以及动态调用对象的方法称为反射机制。
Python的反射机制允许编程人员在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Python增加其灵活性与动态性的一种机制。
二、反射的具体实现
python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def speak(self):
print("I am %,%d years old."%(self.name,self.age))
p = Person("lilong",20)
# 在进行操作之后使用__dict__方法查看
# #### 查看类的字典 ####
# print(Person.__dict__)
# #### 检查是否含有成员 ####
# print(hasattr(p, "name"))
# print(hasattr(p, "age"))
# print(hasattr(p, "speak"))
# #### 获取成员 #### 没有报错,第3个参数为自定义语句(错误提示)
# print(getattr(p, "name"))
# print(getattr(p, "age"))
# print(getattr(p,"speak"))
# #### 设置成员 ####
# setattr(p, "sex", "falme")
# setattr(p, "show", lambda num: num + 1)
# #### 删除成员 ####
# delattr(p, "name")
# delattr(p, "age")
# delattr(p, "speak")
# 结论:
# 实际进行的就是通过操作类的字典进行增删改除
三、自定义(覆盖原有的机制)
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def speak(self):
print("I am %,%d years old."%(self.name,self.age))
def __getattr__(self, item):
print("属性不存在")
def __setattr__(self, key, value): #添加或修改时触发 例如赋值 self.name = name
# self.key = value #无限循环
self.__dict__[key] = value
def __delattr__(self, item): #删除时触发
#del self.item #无限循环
self.__dict__.pop(item)
p = Person("lilong",20)
# print(getattr(p, "sex")) #返回(属性不存在,None),不会报错
# 修改
# p.age = 18
# print(p.__dict__)
# 增加
# p.__dict__["sex"] = "famle"
# print(p.__dict__)
# 删除
# del p.age
# print(p.__dict__)
四、反射的运用
class Test():
def put(self,data):
print(data)
def auth(self,data):
print(data)
def __init__(self):
data = input(">>").strip()
if hasattr(self,data):
func = getattr(self,data)
func(data)
if __name__ == '__main__':
Test()