一、什么是反射
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()