反射
class BlackMedium: feture='Ugly' def __init__(self,name,addr): self.name=name self.addr=addr def sell_hourse(self): print('【%s】 正在卖房子,傻逼才买呢' %self.name) def rent_hourse(self): print('【%s】 正在租房子,傻逼才租呢' % self.name) print(hasattr(BlackMedium,'feture')) #True name是字符串,要加‘’ # b1=BlackMedium('万成置地','天露园') # b1.name--->b1.__dic__['name'] print(b1.__dict__) #{'name': '万成置地', 'addr': '天露园'} # #--------------------------->>hasattr() # # b1.name # # b1.sell_hourse # print(hasattr(b1,'name')) #hasattr不仅仅是找b1的属性字典,而是看b1到底能不能调用它 # print(hasattr(b1,'sell_hourse')) # print(hasattr(b1,'selasdfasdfsadfasdfasdfasdfasdl_hourse')) # # #-------------------------->>getattr() # print(getattr(b1,'name')) #万成置地 # print(getattr(b1,'rent_hourse')) #<bound method BlackMedium.rent_hourse of <__main__.BlackMedium object at 0x00D7DA90>> # func=getattr(b1,'rent_hourse') # func() #【万成置地】 正在租房子,傻逼才租呢 # print(getattr(b1,'rent_hourseasdfsa')) #没有则报错AttributeError: 'BlackMedium' object has no attribute 'rent_hourseasdfsa' print(getattr(b1,'rent_hourseasdfsa','没有这个属性')) #没有这个属性 # default=默认值 #----------------->>setattr # # b1.sb=True # setattr(b1,'sb',True) # print(b1.__dict__) #{'name': '万成置地', 'addr': '天露园', 'sb': True} setattr(b1,'func',lambda x:x+1) print(b1.__dict__) #{'name': '万成置地', 'addr': '天露园', 'func': <function <lambda> at 0x009E5FA8>} print(b1.func(10)) #11 #---------------->>delattr # del b1.sb # delattr(b1,'feture') # print(
b1.__dict__)
反射的应用场景:
当是两个人写代码时,不需要必须一个人先写完
可以实现定义好接口,接口只有在被完成时才会真正执行,这实现了即插即用,‘后期绑定’,
即可以只定义接口,后期再去实现接口的功能
class FtpClient: 'ftp客户端,但是还没实现具体的功能' def __init__(self,addr): print('正在连接服务器[%s]' %addr) self.addr=addr def put(self): print('正在上传文件')
from ftp_client import FtpClient f1=FtpClient('1.1.1.1') # f1.put() if hasattr(f1,'put'): func_get=getattr(f1,'put') func_get() else: print('其他的逻辑')