何时在 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 并不是为了显得聪明,而是为了让代码在运行时能够适应变化,而不是被硬编码的假设所束缚。一旦理解了这一点,它就成为一个非常精准的工具。

Back to Blog

相关文章

阅读更多 »

Python中的随机模块

概述:Python 中的 random 模块提供了生成随机性的工具,例如随机数、从序列中选择项目以及打乱数据。它是……