概念
**反射:**主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省),
四个可以实现自省的函数:
hasattr(object,name)
getattr(object,name,default=None)
setattr(x,y,z)
delattr(x,y)
四个函数的用法
class BlackMedium:
feture='Ugly'
def __init__(self,name,addr):
self.name=name
self.addr=addr
def sell_house(self):
print('[%s] 正在卖房子,千万别买'%self.name)
def rent_house(self):
print('[%s] 正在租房子,千万别租'%self.name)
b1=BlackMedium('saas','北京')
b1.name
b1.sell_house()
#检测b1能否调用到name这和sell_house这两个属性
print(hasattr(b1,'name'))
print(hasattr(b1,'sell_house'))
#找到函数地址
print(getattr(b1,'name'))
print(getattr(b1,'sell_house'))
func=getattr(b1,'sell_house')
func()
print(getattr(b1,'adsdsd','没有这个属性'))
#设置b1.sb=True等同于setattr(b1,'sb,True')
b1.sb=True
setattr(b1,'sb',True)
#加入函数属性
setattr(b1,'func',lambda x:x+1)
setattr(b1,'func1',lambda self:self.name+'23131')
print(b1.__dict__)
print(b1.func)
print(b1.func(10))
print(b1.func1(b1))
#删除del b1.sb等同于delattr(b1,'sb')
delattr(b1,'sb')
print(b1.__dict__)
结果
[saas] 正在卖房子,千万别买
True
True
saas
<bound method BlackMedium.sell_house of <__main__.BlackMedium object at 0x000000A669B7AD68>>
[saas] 正在卖房子,千万别买
没有这个属性
{'name': 'saas', 'addr': '北京', 'sb': True, 'func': <function <lambda> at 0x000000A6687F1F28>, 'func1': <function <lambda> at 0x000000A669B80B70>}
<function <lambda> at 0x000000A6687F1F28>
11
saas23131
{'name': 'saas', 'addr': '北京', 'func': <function <lambda> at 0x000000A6687F1F28>, 'func1': <function <lambda> at 0x000000A669B80B70>}
应用场景:
#A和B两个人共同写一个代码,A写完class Ftp后有事情需要暂停一下工作,然后b再这段时间里还需要继续写
#A写的代码:
class Ftp:
def __init__(self,addr):
print('正在连接服务器【%s】'%addr)
self.addr=addr
#执行一遍后加上put函数
def put(self):
print('正在运行')
#B写的代码:
#B在写代码的时候看不到A的代码,可以通过下面的方式继续写而不影响A的
f1=Ftp('198.12.12.12')
#B想写一个put方法,首先要判断A写的那一部分里有没有这个方法
if hasattr(f1,'put'):
#有则先找到‘put’这个方法的地址,把地址赋给func_put,然后通过func_put()来执行
func_put=getattr(f1,'put')
func_put()
else:
print('其他逻辑')