Python反射(自省)机制

一、动态导入模块。

介绍反射机制之前我们先来看看什么是动态导入模块。这时候,有一个需求,那就是我们不知道用户要导入哪一个模块,这时候我们应该如何设计一个程序满足去导入用户输入的模块呢?

假设我们现在有一个模块test(同级目录)

def printA():
    print('AAAA')
def printB():
    print('BBBB')

这时候我们可以在外部用__ import__实现动态导入。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
imp=input('请输入要导入的模块名')
m=__import__(imp)
m.printA()

上面就已经实现了动态导入模块了。比如直接输入,test即可。但是如果test模块和我们现在的程序不在同一级目录呢。我们应该怎么导入?

假设test在,同级目录aaa下。

m= __import__("aaa.test")  #这样仅仅导入了aaa模块,调用函数的方法是aaa.test.printA()


m = __import__("aaa.test",fromlist = True)  #改用这种方式就能导入成功     调用方法:test.printA()
二、反射机制

其实上面的代码仔细一看,实际上是完全没有意义的。因为当我们不知道要导入哪一个模块的时候我们,根本不知道该去调用那个函数,所有实现动态调用函数也是很有必要的。这时候就该反射机制上场了。
1 hasattr(object, name).判断object是否有name函数,有则返回True
2、getattr(object, name,default).获得一个‘name’的参数,不存在则返回default。不设置,不存在报错
3、setattr(object, name, value) 可以设置数据属性也可以设置函数属性。

#delattr(object, name)
imp=input('请输入要导入的模块名')
m=__import__(imp,fromlist=Truete)
func=input('请输入你要调用的函数')
if hasattr(m,func):
    fun=getattr(m,func)
    fun()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值