sunny-cheng  

#反射:通过字符串映射到对象的属性
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 FtpClient
f1=FtpClient('192.168.1.1')
if hasattr(f1,'get'):
    func_get=getattr(f1,'get')
    func_get()
else:
    print('---->不存在此方法')
    print('处理其他的逻辑')

 

posted on 2018-09-17 13:57  sunny-cheng  阅读(148)  评论(0编辑  收藏  举报