#Auther Bob#--*--conding:utf-8 --*-- #我们来循序渐进的学习反射 import s1 #阶段1# def run():# url = input("请输入要访问的url:")# if url == ‘login‘:# s1.login()# elif url == ‘logout‘:# s1.logout()# elif url == ‘home‘:# s1.home()# else:# print(‘404‘)## run() #阶段2#如果能根据用户输入的值自动找到s1中的函数名,那么上面的函数就会变的很简单,把字符串变为函数名 # import s1# def run():# url = input("请输入要访问的url:")# #如果能用下面的方式,是不是就会变的很简单,但是实际上是不行的,但是我们可以通过反射来实现下面的效果# # s1.url()# #反射的作用:利用字符串的形式去对象(默认)中操作(寻找,判断,删除,设置)成员,就可以用gatarrer# func = getattr(s1,url) #这个意思是去模块s1中,找一个名称为url的函数名,然后把这个值赋值给func,执行func就是可以s1模块中的url函数# func()# #这里还有一个问题,如果s1中没有url这个函数,则会报错,那么我们在执行getattr的时候先判断下函数名url是否存在## run() #阶段3,先判断url是否在模块s1中# import s1# def run():# url = input("请输入要访问的url:")# if hasattr(s1,url):# func = getattr(s1,url)# func()# else:# print(‘404‘)# run() #上面介绍了反射的两个函数:getattr和hasattr,反射还有两个函数delattr()和setattr()# delattr() #模块中删除成员# setattr() #模块中设置成员 # import s1# def run():# url = input("请输入要访问的url:")# delattr(s1,‘login‘)# if hasattr(s1,‘login‘):# print(‘login is exist‘)# else:# print(‘login is not exist‘)## run() #上面的方法可以使用字符串的形式操作模块 #如果我们有很多的模块,成百上千,那么我们导入模块也会导致很多的模块,这也是个相当费力的工作,在importr的时候也可以用到#反射 #下面的方法可以使用字符串的形式导入模块,__import__就可以实现,下面两种方法的效果是一样的 ## import s1# s1.login()## obj = __import__(‘s1‘)# obj.login # def run():# url = input("请输入要访问的url:模块名/函数名:")# mod,func = url.split(‘/‘)# mod_obj = __import__(mod)# f = getattr(mod_obj,func)# f()## run() #如果不用字符串的方式导入模块,我们导入其他模块的目录的模块是可以用下面的方法导致# import lib.s1,但是如果用字符串的方式导入,则用这个方法是不可以的 obj = __import__(‘lib.‘ + ‘s3‘,fromlist=True)print(obj)# <module ‘lib.s3‘ from ‘E:\\python\\pycharm\\模块\\lib\\s3.py‘> #这里查看obj,可以看到我们导入了s3这个模块 obj = __import__(‘lib.s3‘)print(obj)# <module ‘lib‘ from ‘E:\\python\\pycharm\\模块\\lib\\__init__.py‘> #这里查看obj,可以看到我们没有导入s3这个模块
时间: 2024-10-12 09:48:11