反射能够将字符串映射到类的方法或者属性的内存地址,达到通过字符串访问类属性 方法的作用,主要有四种方法
1 class Human(object): 2 def __init__(self, name, age, hobby): 3 self.name = name 4 self.age = age 5 self.hobby = hobby 6 def info(self): 7 print("my name is %s, age ia %s"%(self.name, self.age)) 8 9 def get_hobby(self): #定义一个函数,后面使用setattr方法将其装配进man1这个对象,此时函数与类以及对象无任何关系 10 print("my hobby is %s"%self.hobby) 11 12 man1 = Human("张三", 25, "running") #初始化一个对象 13 fun = input("please inpute the function you want:").strip() 14 if hasattr(man1, fun): #hasattr有两个参数,第一个为对象名,第二个为字符串,判断对象是否有字符串名的属性或者方法,有则返回True,否则返回False 15 getattr(man1, fun)() #getattr参数与hasattr一致,如果字符串对应对象的属性则直接返回属性内容,如果是方法则返回方法的内存地址,内存地址加()就可以获取执行结果 16 else:#当输出其它不属于类本身的方法 属性时就将get_hobby函数装配进对象并调用 17 setattr(man1, fun, get_hobby) #将get_hobby函数装配进man1对象,并且后续使用man1.fun()调用get_hobby,类似于man1.fun = get_hobby 18 getattr(man1, fun)(man1) # 使用getattr调用装配的get_hobby方法,由于方法是后装配的实例调用需要手动传入self即对象本身 19 delattr(man1, fun) #删除man1对象对应fun字符串的方法或者属性,输入非info则上一行正常执行下一行会报错无此方法 20 getattr(man1, fun)(man1)