反射:通过字符串映射或修改程序运行的状态、属性、方法
#---
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)