自省和反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
1 class BlackMeium: 2 def __init__(self, name, addr): 3 self.name = name 4 self.addr = addr 5 6 def sell_house(self): 7 print('[%s] 正在卖房子,傻子才买' % self.name) 8 9 def rent_house(self): 10 print("[%s] 正在租房子,傻子才租" % self.name) 11 12 13 b1 = BlackMeium('万成置地', '湾路缘') 14 print(hasattr(b1, 'name')) 15 print(hasattr(b1, 'addr')) 16 print(hasattr(b1, 'sell_house')) # 表示检测能不能调用到这个函数属性 17 print(getattr(b1, 'name')) # 没有就报错 可以添加一个参数,让其不报错 18 print(getattr(b1, 'sell_house')) 19 obj = getattr(b1, 'sell_house') # 获取函数的地址 20 obj() # 地址加上括号,运行函数 21 # getattr(x,'y') # 相当于x.y 22 # b1.sb = True 23 print(b1.__dict__) 24 setattr(b1, 'sb', True) 25 setattr(b1, 'name', 'SB') 26 print(b1.__dict__) 27 del b1.name 28 delattr(b1, 'sb') 29 print(b1.__dict__) 30 输出: 31 True 32 True 33 True 34 万成置地 35 <bound method BlackMeium.sell_house of <__main__.BlackMeium object at 0x009B1FD0>> 36 [万成置地] 正在卖房子,傻子才买 37 {'name': '万成置地', 'addr': '湾路缘'} 38 {'name': 'SB', 'addr': '湾路缘', 'sb': True} 39 {'addr': '湾路缘'}
1 f1 = FtpClient('192.168.1.1') 2 if hasattr(f1, 'get'): 3 func_get = getattr(f1, 'get') 4 func_get() 5 else: 6 print('----->不存在此方法') 7 print('处理其他的逻辑') 8 # 可插拔式设计 9 module = __import__('m1.t') # 只能调用最顶级的模块,不能导入私用属性 10 import importlib 11 12 m = importlib.import_module('m1.t') # 可以直接导入m1.t模块 13 module.t.test() # 这样才能进行调用