Python的setdefault允许您从字典中获取值,但如果该键不存在,则您分配基于参数default
。然后,您可以获取字典中的任何关键字。在python中,是否有一个setdefault()等价物用于获取对象属性?
没有操作对象的__dict__
对象是否有类似的功能?
例如
我有一个对象foo
,它可能有也可能没有属性bar
。我怎么可以这样做:
result = setdefaultattr(foo,'bar','bah')
Python的setdefault允许您从字典中获取值,但如果该键不存在,则您分配基于参数default
。然后,您可以获取字典中的任何关键字。在python中,是否有一个setdefault()等价物用于获取对象属性?
没有操作对象的__dict__
对象是否有类似的功能?
例如
我有一个对象foo
,它可能有也可能没有属性bar
。我怎么可以这样做:
result = setdefaultattr(foo,'bar','bah')
Python没有一个内置的,但你可以定义自己:
def setdefaultattr(obj, name, value):
if not hasattr(obj, name):
setattr(obj, name, value)
return getattr(obj, name)
vars(obj).setdefault(name, value)
因此vars()只返回obj .__ dict__? – 2009-12-15 01:49:44
(我更喜欢var()语法obj .__ dict__) – 2009-12-15 01:50:16
@Ross当然。请参阅help(vars) – 2009-12-15 01:52:17
需要注意的是目前公认的答案,如果属性不存在,已经调用hasattr(),setattr()和getattr()。这只有在OP做了重写setattr和/或getattr之类的操作时才有必要 - 在这种情况下,OP不是我们为他提供的无辜查询者。否则,调用所有3个函数是严重的;在SETATTR()调用应遵循return value
所以它不会失败于return getattr(....)
按照docs,hasattr()被调用的getattr()和捕获异常实现。当属性已存在时,以下代码可能会更快:
def setdefaultattr(obj, name, value):
try:
return getattr(obj, name)
except AttributeError:
setattr(obj, name, value)
return value
不要这样做。
请。使用__init__
提供默认值。请。这是Pythonic的方式。
class Foo(object):
def __init__(self):
self.bar = 'bah'
这是正常的,标准的典型方法。没有其他的理由。
您是对的。对我感到羞耻:-)我应该去修复__init__函数。 – 2009-12-15 17:33:19
@罗斯罗杰斯:请做。 – 2009-12-15 18:23:44
可能很有理由去做要求的事情,例如,在属性被实际读取时缓存您只需要的属性的临时结果。除此之外,你在你的例子中做的应该是一个普通的类变量栏。你所做的只是无缘无故地膨胀每一个对象。 – Michael 2013-01-07 16:32:02
'def setdefaultattr(o,n,v):return setdefault(o .__ dict__,n,v)''?尽管如此,这不适用于带有插槽的类。 – 2009-12-15 07:02:17