# 1.反射的基本概念
Python中为了能够实现代码的可重复性和动态性,提供了很多动态的执行代码的方法,我们最常见的就是os模块中提供的os.path中常用的获取路径的方法,还有更多的方法比如url中request方法获取url地址,而反射与这上述提到的相同就是为了动态的判断,动态的获取。
- os模块动态的获取地址
1 print(__file__)
2 print(os.path.abspath(__file__))
3 print(os.path.dirname(os.path.abspath(__file__)))
4 print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
5 Base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
目录结构:
----textpackage
----text1
----text_1.1.py
__file__
获取当前文件所在的路径;
os.path.abspath(__file__)
获取当前文件所在的绝对路径;
os.path.dirname()
获取当前路径的上一级路径;
那么我定义Base_path就可以获取到最上层的文件夹,从而定义为根目录,django中settings.py 设置文件中就是这样定义的
- request涉及的属性与方法
1 # 基本的url,
2 self.base_url = request.path_info
- 反射的概念与简单示例
什么事反射:
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。
hasattr(object,name)
判断object类中是否有name这个方法,或者是属性,返回值为True或False;
getattr(object, name, default=None)
获取object中名为name的这个方法或者是属性;
setattr(x, y, v)
给name添加属性
delattr(x, y)
删除属性设置
例1 判断模块中的方法或属性:
1 def func1():
2 return '执行了func1'
3
4
5 def func2():
6 return '执行了func2'
7
8
9 def func3():
10 return '执行了func3'
1 import my_model # 同级目录下直接导入定义的模块
2
3
4 option = str(input('option:'))
5
6 if not hasattr(my_model, option):
7 print('输入无效')
8 else:
9 ret = getattr(my_model, option)()
10 print(ret)
例2 在类中的使用:
创建一个类,表示你认识的人,
1 class Persion:
2 def __init__(self, name, gender, qq):
3 self.name = name
4 self.gender = gender
5 self.qq = qq
6
7 def play(self):
8 return '约{}出来玩'.format(self.name)
9
10 @property
11 def relation(self):
12 return '你和{}是朋友'.format(self.name)
13
14
15 print(hasattr(Persion, 'play')) # True 有名为sell的方法
16 print(hasattr(Persion, 'relation')) # True
情况一:
你有lisa的QQ,没有penny的QQ和微信:
1 p1 = Persion('lisa', 'girl', '242432')
2 p2 = Persion('penny', 'girl', None)
3
4 if hasattr(p1, 'qq'):
5 print(getattr(p1, 'play')())
6 else:
7 print('没有联系方式')
8
9 if hasattr(p2, 'WeChat'):
10 print(getattr(p2, 'play')())
11 else:
12 print('没有联系方式')
约lisa出来玩
没有联系方式
情况二:
你得到了penny的微信:
1 setattr(p2, 'WeChat', 'haha')
2 if hasattr(p2, 'WeChat'):
3 print(getattr(p2, 'play')())
4 else:
5 print('没有联系方式')
约penny出来玩
情况三:
penny删除了你的微信:
1 delattr(p2, 'WeChat')
2 if hasattr(p2, 'WeChat'):
3 print(getattr(p2, 'play')())
4 else:
5 print('没有联系方式')
没有联系方式
#2.django中反射的应用
def post(self, request):
func_obj = request.POST.get('action')
if not hasattr(self, func_obj):
return HttpResponse('你的访问不存在')
ret = getattr(self, func_obj)()
# 如果有ret的话返回get请求重新执行
return self.get(request)
获取前段input框,提交的数据,获取name=‘action’,对应的值,
如果hasattr()判断有值得话,getattr()调用执行