何时在 Python 中使用 getattr
发布: (2025年12月29日 GMT+8 02:56)
3 min read
原文: Dev.to
Source: Dev.to
基本概念
通常,你会这样访问属性:
p.name
只有在编码时就已经知道属性名时,这种写法才有效。
getattr 让你以同样的方式访问属性,但可以动态决定属性名:
getattr(p, "name")
如果字符串 "name" 与 p 上的某个属性匹配,Python 就返回该属性的值。
它们是一样的吗?
是的,但仅限于这种特定情况:
p.name
getattr(p, "name")
两者返回相同的值。
那么 getattr 为什么会存在?因为点号语法无法做到下面这种情况:
attr = "nombre"
p.attr # 会去查找名为 "attr" 的属性
而下面这种写法是可行的:
attr = "name"
getattr(p, attr)
这就是关键区别。
“动态”为何重要
假设你有一个简单的类:
class Person:
def __init__(self):
self.name = "Alice"
self.age = 30
person = Person()
现在想要访问的属性取决于运行时的逻辑:
fields = ["name", "age"]
for field in fields:
print(getattr(person, field))
如果没有 getattr,你只能使用条件语句:
if field == "name":
print(person.name)
elif field == "age":
print(person.age)
默认值(避免崩溃)
另一个重要特性:安全访问。
如果属性不存在,会抛出 AttributeError:
getattr(person, "height")
# AttributeError: 'Person' object has no attribute 'height'
但你可以提供一个后备值:
getattr(person, "height", 170)
这样程序就能安全继续运行。
动态访问方法
属性不仅仅是数据;方法也是属性。
class Calculator:
def add(self, x, y):
return x + y
calc = Calculator()
method = getattr(calc, "add")
print(method(2, 3)) # 5
getattr 不能做的事
getattr 不是:
- 比点号访问更快
- 替代普通属性访问的方案
- 你应该在所有地方都使用的工具
如果你事先已经知道属性名,使用点号语法可能更合适:
p.name
getattr 旨在提供灵活性,而不是为了炫技。
最后思考
getattr 并不是为了显得聪明,而是为了让代码在运行时能够适应变化,而不是被硬编码的假设所束缚。一旦理解了这一点,它就成为一个非常精准的工具。