在Python中,有类似setdefault()的方法获取对象属性吗?

21 投票
4 回答
6861 浏览
提问于 2025-04-15 17:01

Python中的setdefault方法可以让你从字典中获取一个值。如果你想要的键不存在,它会根据你提供的default参数来给这个键赋一个默认值。然后你就可以获取字典中这个键对应的值。

那么,除了操作对象的__dict__,有没有类似的功能可以用在对象上呢?

比如说,
我有一个对象foo,它可能有属性bar,也可能没有。那我该怎么做才能实现类似的功能呢:

result = setdefaultattr(foo,'bar','bah')

4 个回答

3
vars(obj).setdefault(name, value)

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

29

注意,目前被接受的答案中,如果属性还不存在,就会调用 hasattr()setattr()getattr() 这三个函数。只有在提问者做了一些特殊操作,比如重写了 setattrgetattr 的情况下,这样做才是必要的——在这种情况下,提问者就不是我们想象中的那种无辜的询问者了。否则,调用这三个函数就显得很繁琐;在调用 setattr() 后应该直接返回结果,这样就不会再执行到 return getattr(....) 了。

根据文档hasattr 是通过调用 getattr() 并捕获异常来实现的。当属性已经存在时,下面的代码可能会更快:

def setdefaultattr(obj, name, value):
    try:
        return getattr(obj, name)
    except AttributeError:
        setattr(obj, name, value)
    return value
8

Python没有内置的这个功能,但你可以自己定义一个:

def setdefaultattr(obj, name, value):
    if not hasattr(obj, name):
        setattr(obj, name, value)
    return getattr(obj, name)

撰写回答