Python中的反射——getattr与动态导入模块

目录

1. 前言

2. 常见的四种反射函数

3. getattr

4. 动态导入模块


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方法,并且传递字符串路径就好了。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiaoxingk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值