反射: 根据字符串动态的判断,调用,添加/修改,删除类或类的实例化对象中的方法或属性
反射共有四种方法hasattr(),getattr(),setattr(),delattr()
1.通过字符串来判断类里或类的实例化对象里有没有与字符串相同的属性或方法
hasattr(obj,str)---判断一个实例对象obj里是否有对应的str字符串的方法
2.如果有则可以直接调用类中或类的实例化对象中与字符串相同的属性或方法
getattr(obj,str)---根据字符串去获取obj对象里的对应的方法的内存地址,即可加"()"调用
3.如果没有则可以在类中或类的实例化对象中创建一个新的与字符串相同的属性或方法
若通过字符串判断类中或类的实例化对象中有与字符串相同的属性,则可以修改此属性的值
setattr(obj,str,value)---通过str字符串去设置obj对象里的属性的值value或添加与value相同的方法名的方法
4.如果有也可以通过字符串来动态的删除类中或类的实例化对象中的属性或方法
delattr(obj,str)---删除和字符串名字一致的属性或方法
1 #定义一个类(学生类) 2 class student(object): 3 def __init__(self,name): 4 self.name = name;#定义一个属性(姓名) 5 6 #定义一个方法(学习) 7 def study(self): 8 print('%s in the room study '%self.name) 9 10 11 #实例化学生类 12 stuobj = student("shanghai") 13 14 def fun(self): 15 print("%s play game-0-0-"%self.name) 16 17 #输入一个字符串 18 str = input("输入的字符串str:") 19 #判断这个字符串是不是类中的属性或方法 20 if hasattr(stuobj,str): 21 22 ''' #动态的调用一个方法 23 #若是则根据字符串去获取stuobj对象里的对应的方法的内存地址并赋值给func 24 func = getattr(stuobj,str) 25 #func调用 26 func() 27 #输入的字符串str:study 28 #输出结果:shanghai in the room study 29 ''' 30 31 ''' #动态的修改属性,把name属性修改成beijing 32 #若通过字符串判断类中或类的实例化对象中有与字符串相同的属性,则可以修改此属性并赋值 33 setattr(stuobj,str,"beijing") 34 print(getattr(stuobj,str)) 35 #输入的字符串str:name 36 #输出结果beijing 37 ''' 38 39 ''' #动态的删除方法或属性 40 #如果有也可以通过字符串来动态的删除类中或类的实例化对象中的属性或方法 41 delattr(stuobj,str) 42 print(hasattr(stuobj,str)) 43 #输入的字符串str:study 44 #输出结果:异常信息Traceback (most recent call last):---AttributeError: study (study错误) 45 ''' 46 47 else: 48 49 ''' #动态的装配方法 50 #如果不是则可以在类中或类的实例化对象中创建一个新的与字符串相同的方法(动态的把方法装配到类中或类的实例化对象中) 51 setattr(stuobj,str,fun) 52 #用类的实例化对象来调用这个方法并传入这个实例化对象(因为要传入参数所以要传入实例对象) 53 stuobj.talk(stuobj) 54 #输入的字符串str:talk 55 #输出结果:shanghai play game-0-0- 56 ''' 57 58 ''' #动态的装配属性 59 #若通过字符串判断类中或类的实例化对象中没有与字符串相同的属性,则可以创建此属性并赋值 60 setattr(stuobj,str,22) 61 print(getattr(stuobj,str)) 62 #输入的字符串str:age 63 #输出结果:22 64 '''