python学习DAY10(反射)

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

 

posted @ 2019-08-16 10:41  LBC不认输  阅读(119)  评论(0编辑  收藏  举报