反射的基本概念及应用
admin
2023-01-29 00:00:03
0

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     @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()调用执行

相关内容

热门资讯

关于二手烟,校园里一场微妙的“... 入学第一天,尚萌萌看到学校里很多人叼着烟。第二天一早,他打开宿舍门,看到对面墙角蹲着一个人在吸烟,走...
意大利再现“弗洛伊德案”,梅洛... 【环球时报驻意大利特约记者 李欣怡】意大利博洛尼亚近日出现骚乱,一名叫法基尔的摩洛哥裔男子在警察执法...
“处”改“科”、“科”改“股”... 澎湃新闻记者 蒋子文澎湃新闻注意到,近期,江苏省高邮市、涟水县等县级行政区的多个机关单位相继宣布规范...
女子参加聚会遭猥亵,男子获刑1... 近日,一位来自广东的陈女士(化名)反映称,去年多年未见的初中同学孔某趁她聚餐醉酒、丧失反抗能力之机,...
美军被疑隐瞒对伊作战伤亡 【环球时报综合报道】美国国防部21日发表声明说,一名美军士兵17日在伊朗针对位于约旦的穆沃费格萨勒提...
OpenAI模型“越狱”攻击,... 一家美国公司遭到美国AI攻击,而提供保护的竟是一款中国人工智能工具。AI工具平台Hugging Fa...
南航第十二架C919国产大飞机... 广州7月21日电 (记者 郭军)7月21日,一架尾号为B-659G的国产大飞机飞抵广州白云国际机场,...
无人艇第一股,要来了 那个被资本追捧的“无人艇第一股”,要来了。 2017年冬天的一个夜晚,港珠澳大桥附近的海面上,81条...
三一锂能取得电池包专利提升电芯... 国家知识产权局信息显示,三一锂能有限公司取得一项名为“电池包”的专利,授权公告号CN22453717...
价格为何下滑?市场竞争力为何不... 记者采访西瓜种植主产区河南开封等地如何种得好,又能卖得好(经济聚焦)本报记者 常 钦 《人民日报》(...