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'>
正在上传文件

 

posted @ 2020-11-09 15:50  泉love水  阅读(308)  评论(0编辑  收藏  举报