python反射和动态导入
1、反射
python的反射是指通过字符串的形式操作对象的相关属性
1、hasattr(obj,'name') # 判断对象中是否含有字符串形式的方法名或属性名,返回True、False 2、getattr(obj,'name',None) # 返回对象中的方法或属性: obj.name,如果没有此方法或属性,返回None 3、setattr(obj,'name',value) # 设置对象中方法或属性的值: obj.name = value 4、delattr(obj,'name') # 删除对象中的方法或属性
class Ftp: name='ftp' def __init__(self,ip,port): self.ip=ip self.port=port def get(self): print('获取文件中') def put(self): print('上传文件中') def cmd(self): if getattr(self,'get'): self.get() obj=Ftp('127.0.0.1',22) print(hasattr(obj,'name')) print(hasattr(obj,'get')) a=getattr(obj,'name') print(a) fun=getattr(obj,'get') fun() setattr(obj,'a','ddd') print(obj.__dict__) print(hasattr(Ftp,'get')) obj.cmd() #执行结果 True True ftp 获取文件中 {'ip': '127.0.0.1', 'port': 22, 'a': 'ddd'} True 获取文件中
2、动态导入模块
动态导入模块就是只知道str类型的模块名字符串,通过这个字符串导入模块
1、通过__import__ 一般不建议使用
./
├── mtest
│ └── m.py#仅包含一个print语句
└── test.py
s='mtest.m' m_mod=__import__(s)#m_mod其实代表的是mtest,调用的话要用m_mod.m.put print(m_mod) print(m_mod.m.put()) # <module 'mtest' (namespace)> 正在上传文件
2、使用importlib实现
import importlib s='mtest.m' m_mod=importlib.import_module(s) print(m_mod) print(m_mod.put()) # <module 'mtest.m' from 'D:\\PyChram-progect\\面向对象\\第二章案例\\mtest\\m.py'> 正在上传文件