目录
1. 前言
本文主要介绍python反射的概念、使用 , 以及如何通过字符串的形式导入模块
反射主要应用于类的对象上,在运行时,获取对象中的属性和方法,通过字符串对对象成员(属性、方法)进行查找、获取、删除、添加成员等动作。
一般使用场景:动态的向对象中添加属性和方法;也可以动态的调用对象中的方法或者属性。
2. 常见的四种反射函数
方法 | 用法 |
---|---|
hasattr(obj,name_str) | 判断输入的name_str字符串在对象obj中是否存在(属性或方法),存在返回True,否则返回False。 |
getattr(obj,name_str) | 将按照输入的name_str字符串在对象obj中查找,如找到同名属性,则返回该属性;如找到同名方法,则返回方法的引用;如果未能找到同名的属性或者方法,则抛出异常:AttributeError。 |
setattr(obj,name_str,value) | name_str为属性名或者方法名,value为属性值或者方法的引用。 |
delattr(obj,name_str) | 将你输入的字符串name_str在对象obj中查找,如找到同名属性或者方法就进行删除。 |
今天,我们主要是看getattr
3. getattr
这是我现在的文件目录,User类位于view下
这个时候,我需要动态获取view下的USER,我该如何来做呢?
通过这种形式,我们可以以字符串的方式来获取一个模块下的任意数据:
from view import login
user = getattr(login, 'USER')
print(user)
在实际运用中,如果我们不知道一个模块是否有该方法的时候,我们可以提前设置默认值,避免报错
from view import login
user = getattr(login, 'USERR' , None)
print(user)
这会比常规的获取更加友好,直接通过模块访问,会发生报错,还需要做异常处理
4. 动态导入模块
有时候,我们在进行参数传递时,传递的可能是一个模块的路径,但是对于字符串的处理,我们无法直接转换为模块导入,这个时候就需要用到importlib进行动态导入模块了。
其实也非常的简单:
# from view import login
import importlib
login = importlib.import_module('view.login')
user = getattr(login, 'USER' , None)
print(user)
只需要调用import_module方法,并且传递字符串路径就好了。