自省和反射 动态导入模块

自省和反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

 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()  # 这样才能进行调用

猜你喜欢

转载自www.cnblogs.com/ch2020/p/12434888.html