博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射的基本概念及应用
阅读量:6307 次
发布时间:2019-06-22

本文共 2017 字,大约阅读时间需要 6 分钟。

1.反射的基本概念

反射的概念与简单示例

什么事反射:
反射的概念是由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     @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

你可能感兴趣的文章
linux查看命令是由哪个软件包提供的
查看>>
高级Linux工程师常用软件清单
查看>>
堆排序算法
查看>>
folders.cgi占用系统大量资源
查看>>
路由器ospf动态路由配置
查看>>
zabbix监控安装与配置
查看>>
python 异常
查看>>
last_insert_id()获取mysql最后一条记录ID
查看>>
可执行程序找不到lib库地址的处理方法
查看>>
bash数组
查看>>
Richard M. Stallman 给《自由开源软件本地化》写的前言
查看>>
oracle数据库密码过期报错
查看>>
修改mysql数据库的默认编码方式 .
查看>>
zip
查看>>
How to recover from root.sh on 11.2 Grid Infrastructure Failed
查看>>
rhel6下安装配置Squid过程
查看>>
《树莓派开发实战(第2版)》——1.1 选择树莓派型号
查看>>
在 Linux 下使用 fdisk 扩展分区容量
查看>>
结合AlphaGo算法和大数据的量化基本面分析法探讨
查看>>
如何在 Ubuntu Linux 16.04 LTS 中使用多个连接加速 apt-get/apt
查看>>