python之getattr()函数和importlib库的使用


之所以使用到getattr()函数,因为我有一个需求,希望通过字符串指定使用某一个函数或者类。

1、getattr()介绍

先把官方文档的介绍抄过来:

getattr(object, name[, default])
返回对象命名属性的值。name 必须是字符串。如果该字符串是对象的属性之一,则返回该属性的值。例如, getattr(x, ‘foobar’) 等同于 x.foobar。如果指定的属性不存在,且提供了 default 值,则返回它,否则触发 AttributeError。

也就是如果对象obj有一个属性为func,则可以通过以下方式获取到该属性:

# 假设func是一个函数
attr=getattr(obj,"func","not found")
attr() # 执行该函数

等同于obj.func(),如果obj不存在,则attr=“not found”

2、如果对象obj是类对象

如果obj是类,我们可以通过该函数获取类的属性或者方法

通过下面的代码,我们可以获取到类的属性和方法:

# 定义一个类
class A:
    pv=3
    def __init__(self):
        pass
    def pf(self):
        print("pf")
    
    def tf(self):
        print("tf")
CA=A()	# 实例化

# 获取到CA类的pf函数
res=getattr(CA,'pf')
res()	# 执行函数
> output: pf

# 获取到CA类的变量属性pv
res=getattr(CA,"pv")
print(res) # 打印变量
> output:3

3、如果对象obj是模块对象

实际上可能更有用的是模块对象,我在一个模块中定义了很多个不同功能的类,通过字符串去获取不同的类。
先看看我们自定义一个模块结构:

utils
--__init__.py
--A.py
--B.py
--C.py
--D.py

__init__.py文件内容如下:

# 将这四个类暴露出去
from A import Add
from B import Sub
from C import Div
from D import Mul

也即是在utils这个模块中,有四个类,这四个类就是utils的属性,可以通过字符串来获取某个类
现在来根据字符串获取类对象:

# 获取到加类
import utlis
clas=getattr(utlis,'Add')	# 获取到Add这个类
op=clas()	# 实例化Add这个类

其他三个类同理

4、如果查看对象obj的属性?

使用dir()函数,如果你想知道类A有哪些属性,直接dir(A);如果你想知道模块对象有哪些属性,直接dir(utils);

官方文档有详细介绍以及例子:dir([object])

你可以看到通过dir()函数列举出来的属性,也是字符串,而getattr()中也需要传入属性的字符串形式

5、总结

无论是类对象还是模块对象,或者是其他什么对象,都可以通过dir([obj])查看他们的属性,然后通过getattr(object, name[, default])来获取object中名为name的属性,如果没有名为name的属性,则返回的是default,如果没有定义default则触发AttributeError异常。

6、importlib的使用

importlib最常用的就是它的import_module方法,比如importlib.import_module("cv2")效果和import cv2是一样的,但是import_module是可以用对象的字符串名字导入的,也就是我们可以在外部直接传入字符串直接指定需要导入哪个对象。比如现在我有两个网络模型:resnet.py中有Net()类和vgg.py中有Net()类,我需要通过字符串指定用哪个类,如果用import则这样写:

if arch_name=="resnet":
	from resnet import Net
elif arch_namr=="vgg":
	from vgg import Net
net=Net()

但是用import_module则这样写:

net=importlib.import_module("Net",package="{}".format(arch_name))
#其中相当于package.net,package可以是多级路径

可以看出当选择越多,import_module优势越大。
对于某些情况,对象引用路径比较复杂,可以看看这篇文章python importlib 用法小结

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我是一个对称矩阵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值