博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PYTHON开发必备技能(5)
阅读量:6351 次
发布时间:2019-06-22

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

Python反射机制

我记得以前学习Java的时候,就接触到了反射的概念,后来随着工作,经常听到反射的概念,今天决定好好总结一下。

下面3篇博客我感觉写的很不错,大家可以进行参考。

首先大家需要知道反射的概念,比较经典的解释分为以下几种:

  • 反射是通过字符串的形式操作对象相关的成员,反射的的本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!

Python当中的反射涉及到了四个主要方法

hasattr(obj,name_str):判断对象obj是否含有名为name_str的方法或者静态属性,返回值为布尔值,即通过字符串的形式来判断对

象内部是否含有某个属性。

getattr(obj,name_str):根据字符串name_str去获取对象obj当中对应函数的内存地址或者静态属性对应的数值,如果返回值为函数

的内存地址,需要加上括号才能够调用。

setattr(obj,name_str,value): 添加或者修改obj对象当中名为name_str的属性或者方法的数值。

delattr(obj,name_str): 删除obj对象当中名为name_str的属性。


 

示例程序:Python当中的反射对应的四个方法

#!/usr/bin/python# -*- coding:utf-8 -*-class Student(object):    def __init__(self,name,age):        self.name = name        self.age = age    def study(self,name):        print('%s is studing'%self.name)student = Student('angela',25)print(student.__dict__)  #查看student的成员属性(名称空间对应的成员)#检查对象是否含有某个成员.print(hasattr(student,'name'))print(hasattr(student,'study'))#通过字符串获取对象当中某个成员对应的数值.func = getattr(student,'study')print(func)func(student)#通过字符串设置或增加对象当中某个成员的数值setattr(student,'name','Jack')setattr(student,'salary',2000)print(student.__dict__)#通过字符串删除对象当中的某个成员.delattr(student,'name')delattr(student,'salary')print(student.__dict__)

运行结果:

{'name': 'angela', 'age': 25}TrueTrue
>angela is studing{'salary': 2000, 'name': 'Jack', 'age': 25}{'age': 25}{'show':
at 0x0000000001E5CBF8>, 'age': 25}Process finished with exit code 0

反射的应用场景:

在程序当中,如果我们想通过一个字符串变量var来导入一个模块或者一个模块下的某个方法,这个时候直接执行import var是会报错的,因为var在程序当中是一个变量,通过字符串变量来直接调用名字看起来相同的函数是不可行的,这个时候就需要使用到反射。根据用户输入的url的不同,调用不同的函数,实现不同的操作,也就是一个web url路由器的功能,这在web框架里是核心部件之一。


 

示例程序1:首先,有一个commons模块,它里面有几个函数,分别用于展示不同的页面,代码如下:

#!/usr/bin/python# -*- coding:utf-8 -*-def login():    print('这是一个登陆页面!')def logout():    print('这是一个退出页面!')def home():    print('这是网站的主页面.')

随后,有一个visit模块,通过这个模块可以登录到不同的页面(简易版程序),如果没有使用到反射,大部分人可能会这样写:

#!/usr/bin/python# -*- coding:utf-8 -*-import commonsdef run():    inp = input('请输入你想访问的页面的url:').strip()    if inp == 'login':        commons.login()    elif inp == 'logout':        commons.logout()    elif inp == 'home':        commons.home()    else:        print('404')if __name__ == '__main__':    run()

运行结果示例:

请输入你想访问的页面的url:login这是一个登陆页面!Process finished with exit code 0  

 如果你会使用反射的话,我们就可以这样写(万物皆对象)

import commonsdef run():    inp = input('请输入你想访问的页面的url:').strip()    if hasattr(commons,inp):        func = getattr(commons,inp)        func()    else:        print('404')if __name__ == '__main__':    run()

转载于:https://www.cnblogs.com/zmyting/p/9515136.html

你可能感兴趣的文章
java.lang.OutOfMemoryError异常解决方法
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
Java内存模型
查看>>
mybatis缓存机制与hibernate缓存机制
查看>>
opencv查找mat的值
查看>>
解决mysql数据库大小写敏感问题
查看>>
JVM学习笔记-操作数栈(Operand Stack)
查看>>
详解 MySql InnoDB 中意向锁的作用
查看>>
在nginx上配置域名解析器
查看>>
哈夫曼编码
查看>>
Elastic 今日在纽交所上市,股价最高暴涨122%。
查看>>
!KMP算法完整教程
查看>>
CocoaPods 的简单快速安装方法
查看>>
让人目瞪口呆的三位世界级电脑大师
查看>>
学习——>JNI设置C++与java的结合(2)
查看>>
小程序员看《非诚勿扰》
查看>>
Apache+php+mysql在windows下的安装与配置图解1
查看>>
window.innerWidth和window.innerHeight
查看>>
wordpress代码调用大全
查看>>
修改Eclipse中html/jsp代码对齐样式
查看>>