#反射:通过字符串映射到对象的属性 class Peple: def __init__(self,name,age): self.name=name self.age=age def talk(self): print('%s in talking' %self.name) obj=Peple('egon',18) # print(obj.name) #本质 obj.__dict__['name'] # print(obj.talk) # print(Peple.__dict__) #类的名称空间 # choice=input(">>: ") #input所有输入都是一个str choice=str # print(obj.choice) #这里调用obj的是一个方法 ,所以这样调用时不行的 #查存不存在 # print(hasattr(obj,'name')) #obj.__dict__['name'] # print(hasattr(obj,'talk')) #obj.talk #取到查询的值 # print(getattr(obj,'name',None)) # print(getattr(obj,'talk',None)) #增加属性 # setattr(obj,'sex','male') # print(obj.sex) #删除属性 # delattr(obj,'age') # print(obj.__dict__) #反射的应用 class Service: def run(self): while True: cmd=input('>>: ').strip() if hasattr(self,cmd): #判断输入的字符串是否存在,存在就掉用 func=getattr(self,cmd) func() def get(self): print('get......') def put(self): print('put......') obj=Service() obj.run() 总之反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用, 这其实是一种‘后期绑定’,什么意思?即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能
好处一:实现可插拔机制
有俩程序员,一个lili,一个是egon,lili在写程序的时候需要用到egon所写的类,但是egon去跟女朋友度蜜月去了,
还没有完成他写的类,lili想到了反射,使用了反射机制lili可以继续完成自己的代码,
等egon度蜜月回来后再继续完成类的定义并且去实现lili想要的功能。
egon还没有实现全部功能
class FtpClient: 'ftp客户端,但是还么有实现具体的功能' def __init__(self,addr): print('正在连接服务器[%s]' %addr) self.addr=addr
不影响lili的代码编写
#from module import FtpClientf1=FtpClient('192.168.1.1')if hasattr(f1,'get'): func_get=getattr(f1,'get') func_get()else: print('---->不存在此方法') print('处理其他的逻辑')