本文共 2017 字,大约阅读时间需要 6 分钟。
反射的概念与简单示例
什么事反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。hasattr(object,name)
getattr(object, name, default=None)
setattr(x, y, v)
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 @property11 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()调用执行转载于:https://blog.51cto.com/13747953/2368109