反射:通过字符串映射或修改程序运行的状态、属性、方法 #--- hasattr(obj,str):判断对象里是否有对应的字符串的方法,返回True或False:第一个参数是对象名,第二个参数是需要查找的字符串的方法 getattr(obj,str):根据字符串调用对象里字符串对应的方法,返回的是该方法的内存地址:第一个参数是对象名,第二个参数是需要调用的属性或方法 setattr(obj,str,func):为类设置新方法:第一个参数是对象名,第二个参数是字符串,第三个参数是新的方法名或新的属性值。对象调用的时候是以str的字符串为方法名调用 delattr(obj,str):删除字符串对应的属性或方法:第一个参数是对象名,第二个参数是字符串 #--- #注意!每次新添加的属性或方法,如果需要调用,则必须用一个新的变量名去接收getattr(obj,str)返回的结果,再去进行相应的操作,类似于t.choice是不可行的,必须要用到getattr(obj,str) class Test(self): def __init__(self,name): self.name=name def test(self): print("%s is test"%self.name) t=Test("lbc") choice=input(">>:").strip() #反射 #输入字符串动态匹配类中的方法 #hasattr:判断对象里是否有对应的字符串的方法,返回True或False print(hasattr(t,choice)) #如果hasattr返回True,进行动态调用 #getattr:根据字符串调用对象里字符串对应的方法,返回的是该方法的内存地址 getattr(t,choice) getattr(t,choice)() #没加括号是返回内存地址,加上括号即调用 #---自定义函数添加到类中 def newone(self): print("this is newone") #--- #------流程小结 if hasattr(t,choice): func=getattr(t,choice) #赋值给一个变量的目的是方便可以传参 func() else: #传方法 setattr(t,choice,newone) #将newone方法传进类中 #假设输入的choice是talk t.talk(t) #注意传进对象本身(也可以可以采用getattr方法) #传属性 setattr(t,choice,22) getattr(t,choice) #返回22 #------ #---修改字符串对应的属性 if hasattr(t,choice): attr=getattr(t,choice) setattr(t,choice,"aaa") #"lbc" ---> "aaa" #如果存在,删除choice对应的方法或属性 delattr(t,choice)