反射

#反射
#反射主要指程序可以访问、检测和修改它本身状态或行为的一种能力(自省),主要的逻辑写好(只定义接口)
然后后期再实现接口功能。

#hasattr(对象,属性名称) #判断对象能否调用属性(判断属性是否存在),能则返回True,否则返回False
#getattr(对象,属性名称) #得到属性的值
#setattr(x,y,v) #修改/新增属性 等价于 x.y=v ,x=对象,y=旧属性,v=新属性
#delattr(x,y) #删除属性 等价于 x.y x=对象,y=属性

#实例:
class Reflect:
x = '反射'
def __init__(self,y,z):
self.y = y
self.z = z
def fun(self):
print('来自fun')
def func(self):
print('来自func')
r1 = Reflect(1,2)
print(hasattr(r1,'x')) #返回True
print(hasattr(r1,'y')) #返回True
print(hasattr(r1,'s')) #属性不存在,返回False
print('------------hasattr--end-------------')
#
setattr(r1,'newx','新增的') #等价于x.y = v
print(r1.__dict__) #{'y': 1, 'z': 2, 'newx': '新增的'}
setattr(r1,'y',11) #修改y
print(r1.__dict__) #{'y': 11, 'z': 2, 'newx': '新增的'}
print('------------setattr--end--------------')
#
print(getattr(r1,'x')) #得到属性x=反射 等价于r1.x
#
delattr(r1,'newx') #删除属性newx ,等价于del r1.newx
print(r1.__dict__) #{'y': 11, 'z': 2}
print('----------delattr--end------------')

#
作用:可以实现定义接口,接口只有在被完成后才会真正执行,这实现了即插即用,即可以事先把
class Ftp:
#ftp客户端,但是还没有实现具体的功能
def __init__(self,addr):
print('正在连接服务器%s'%addr)
self.addr = addr

#反射的好处:不影响使用者的使用
#from moudle rmport FtpClient
f1 = Ftp('192.168.1.1')
while hasattr(f1,'get'):
func_get = getattr(f1,'get')
func_get()
else:
print('不存在此方法')
print('处理其他逻辑')
原文地址:https://www.cnblogs.com/shadowfolk/p/14660194.html