- 1、getattr()介绍
- 2、如果对象obj是类对象
- 3、如果对象obj是模块对象
- 4、如果查看对象obj的属性?
- 5、总结
之所以使用到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异常。



